1

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 が正しく設定されます。また、次のことも試しました。

  1. 永続化後の呼び出しem.flush();: 何もしません
  2. 永続化後の呼び出しem.refresh(entity);: エンティティがデータベースに存在しなくなったことを示す例外 (これは間違っています)
  3. em.merge()の代わりに試していますem.persist(): 予想どおり、同じ結果です
  4. 呼び出すem.contains(entity);と true が返されるため、エンティティは実際にアタッチされています
  5. em.persist();を使用して別のメソッドで実行することにより、別のトランザクションに入れる@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)

persist(); には何らかの問題があるはずです。@EmbeddedId を使用している場合でも、取得できません。

4

1 に答える 1