2013-01-08 3 views
0

키가 긴 ID와 타임 스탬프로 구성되는 복합 키가있는 최대 절전 모드 엔티티가있다. ID는 시퀀스 생성기를 사용해야합니다.복합 키 요소에 대해 최대 절전 모드 시퀀스 생성이 작동하지 않는다.

MyEntity :

@Entity 
@Table(name="MY_ENTITY") 
public class MyEntity { 
    private MyEntityPk myEntityPk; 

    @EmbededId 
    public MyEntityPk getMyEntityPk() { 
     return myEntityPk; 
    } 

    // setter omitted 

    // other properties/getters/setters omitted 
} 

MyEntityPk :이 제대로 유선처럼

public class MyEntityPk implements Serializable { 

    // version UID/hashCode()/equals() omitted 

    private Long myEntityId; 
    private Timestamp revisionTime; 

    @Column(name = "MY_ENTITY_ID", unique = true, nullable = false, precision = 13, scale = 0) 
    @GeneratedValue(strategy=GenerationType.AUTO, generator="HIBERNATE_SEQUENCE_GEN") 
    @SequenceGenerator(name="HIBERNATE_SEQUENCE_GEN", sequenceName="HIBERNATE_SEQUENCE") 
    public Long getMyEntityId() { 
     return myEntityId; 
    } 

    public void setMyEntityId(Long myEntityId) { 
     this.myEntityId = myEntityId; 
    } 

    @Column(name = "REVISION_TS", nullable = false) 
    public Timestamp getRevisionTime() { 
     return revisionTime; 
    } 

    public void setRevisionTime(Timestamp revisionTime) { 
     this.revisionTime = revisionTime; 
    } 

} 

는 PK가 보인다. 모두 찾기를 수행 할 때 MyEntity 객체의 목록이 있는데, 각 MyEntityPk 객체에는 ID와 데이터베이스의 revisionTime이 있습니다.

삽입시, 다음은 MY_ENTITY_ID가 null이고 db가 해당 열에 널값을 허용하지 않음을 나타내는 오류를 제공합니다. 우리의 다른 엔티티들로 우리는 자동 생성 된 ID들을 삽입하고 남겨 둘 수 있고, Hibernate는 db로부터 다음 시퀀스를 가져 와서 엔티티에서 그것을 사용하는 것을 안다. 이 경우, 어떤 이유로 일이 아니에요 그 :

MyEntity e = new MyEntity(); 

MyEntityPk pk = new MyEntityPk(); 
pk.setRevisionTime(new Timestamp(System.currentTimeMillis())); 
//pk.setMyEntityId(5l); // see note below 
e.setMyEntityPk(pk); 

// setting a bunch of other entity parameters omitted 

Session session = getSession(); 
session.saveOrUpdate(entity); 

나를 포기 끝 : 내가 수동으로 PK 객체의 ID를 설정하는 경우, 삽입이 작동합니다

// a bunch of stack trace omitted 
Caused by: java.sql.BatchUpdateException: ORA-01400: cannot insert NULL into ("MY_SCHEMA"."MY_ENTITY"."MY_ENTITY_ID") 
// more stack trace omitted 

참고.

답변

1

나는 오직 다른 테이블에 대한 참조 복합 키를 사용하지만, 먼저 나쁜 소식처럼 보인다에서 하나 JPA Composite Key + Sequence

살펴보고 있지만, 당신은 허용 대답의 의견을 읽고 있다면 당신은 운이 수

+0

네 말이 맞아, 이건 나쁜 소식이야. 나는 우리가 Hibernate (3.3)의 이전 버전을 사용하지 않았으며 이것이 3.5에서 수정 된 것처럼 보인다. 저장하기 전에 시퀀스에서 ID를 수동으로 가져 와서이 문제를 해결할 수있었습니다. –