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