質問

私は私が戦っている休眠について一般的な質問をしています。

クラスAとクラスBを持っています。ここで、bはa に依存します

私がem.persist(objoftypea)を呼び出すときの私のコードでは、挿入が行くと、Tables AAAとBBBの両方に挿入されます。手動でAを取得し、各オブジェクトのリストにそれをリストに記入してからそのリストを永続化してください。 しかし、私はこれがハイバネートによって魔法のようにに起こると予想します。

私は何か悪いことをしていますか? それとも私は冬眠を期待していますか?

ありがとう

@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;
...     
}
.

役に立ちましたか?

解決

私はついにそれを取り出しました。 私が与えられた例のどれも私に何が間違っていたのか私に言わなかった、それは私がこの結論に来ることができた私自身の実験の後にのみだった: の代わりに

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

うまくいかなかった(FKはまだヌルとして来ていました)

これはうまくいった:

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

他のヒント

Class 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を間違った場所で使用していて、それを修正しました。

ここ

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top