2つのJPAエンティティがあるとしましょう
@Entity
public class MyComplexEntity implements Serializable {
private static final long serialVersionUID = 1L;
@EmbeddedId
@GeneratedValue(strategy = GenerationType.IDENTITY)
private MyComplexEntityId id;
private String text;
public MyComplexEntity() {
}
public MyComplexEntity(String text) {
this.text = text;
}
public MyComplexEntityId getId() {
return id;
}
public void setId(MyComplexEntityId id) {
this.id = id;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
@Override
public String toString() {
return "MyComplexEntity{" + "id=" + id + ", text=" + text + '}';
}
}
と
@Embeddable
public class MyComplexEntityId {
@Column
private long id;
public MyComplexEntityId(long id) {
this.id = id;
}
public MyComplexEntityId() {
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
@Override
public String toString() {
return "MyComplexEntityId{" + "id=" + id + '}';
}
}
今、私はこのような新しい MyComplexEntity オブジェクトを永続化しようとしています
MyComplexEntity entity = new MyComplexEntity("something");
em.persist(entity);
System.out.println(entity);
そして私が得るのはこれです:
MyComplexEntity{id=null, text=something}
idがnullなのはなぜですか?プリミティブな主キー タイプで同じことを行うと、永続化後に ID が正しく設定されます。また、次のことも試しました。
- 永続化後の呼び出し
em.flush();
: 何もしません - 永続化後の呼び出し
em.refresh(entity);
: エンティティがデータベースに存在しなくなったことを示す例外 (これは間違っています) em.merge()
の代わりに試していますem.persist()
: 予想どおり、同じ結果です- 呼び出す
em.contains(entity);
と true が返されるため、エンティティは実際にアタッチされています em.persist();
を使用して別のメソッドで実行することにより、別のトランザクションに入れる@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
persist(); には何らかの問題があるはずです。@EmbeddedId を使用している場合でも、取得できません。