8

私が戦っている Hibernate についての一般的な質問があります。

クラスAとクラスBがあり、BはAに依存しています

私のコードでは、em.persist(objOfTypeA) を呼び出すと、挿入が行われ、テーブル AAA と BBB の両方に挿入されることが予想されます。A が A の ID を取得し、それを各オブジェクトのリストに手動で入力し、そのリストを永続化すると、うまくいきます。しかし、これはHibernate によって魔法のように起こると思います。

私は何か間違ったことをしていますか?それとも、Hibernate に期待しすぎているのでしょうか?

ありがとう

@Entity
@Table(name = "AAA")
@Veto
public class A {

    @Id
    @GeneratedValue
    @Column(name = "Id")
    private Long id;


    @NotNull
    @Column(name = "Name")
    private Long name;

    ...

    @OneToMany(mappedBy="a", fetch=FetchType.LAZY, cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE})
    private List<B> b;
...
}

@Entity
@Table(name = "BBB")
@Veto
public class B {

    @Id
    @GeneratedValue
    @Column(name="Id")
    private Long id;

    @NotNull
    @Column(name="AId")
    private Long aId;

    @NotNull
    @Column(name = "Name")
    private Long name;

    @JoinColumn(name = "AId", referencedColumnName="Id", updatable = false, insertable = false)
    @ManyToOne(optional = false)
    private A a;
...     
}
4

2 に答える 2

3

私はついにそれを解決しました。私が与えられた、または見つけた例のどれも、何が間違っているかを正確に教えてくれませんでした.

持つ代わりに

@OneToMany(mappedBy="a", fetch=FetchType.LAZY, cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE})
private List<B> b;

それはうまくいきませんでした(FKはまだNULLとして来ていました)

これはうまくいきました:

@OneToMany(fetch=FetchType.LAZY, cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE})
@JoinColumn(name="AId")
@NotNull
private List<B> b;
于 2012-03-05T12:25:05.213 に答える
1

クラスのマッピングを次のように変更Bします。

@Entity
@Table(name = "BBB")
@Veto
public class B {

    @Id
    @GeneratedValue
    @Column(name="Id")
    private Long id;

    @NotNull
    @Column(name="AId", updatable = false, insertable = false)
    private Long aId;

    @NotNull
    @Column(name = "Name")
    private Long name;

    @JoinColumn(name = "AId", referencedColumnName="Id")
    @ManyToOne(optional = false)
    private A a;
...     
}

updatable = false, insertable = false間違った場所で属性を使用していたため、修正しました。

ここを読んで、それらがどのように機能するかを理解してください。

于 2012-02-25T14:31:52.243 に答える