2012-02-25 17 views
7

私は、私が戦っている休止状態に関する一般的な質問があります。HibernateカスケードPERSIST

私は、インサートが行くと、両方のテーブルAAAとBBBに挿入するために期待する(objOfTypeA)em.persistを呼び出したときにBが私のコードでは

に依存しているクラスAとクラスBを、持っています。私が手作業でAのIDを取得して各オブジェクトのリストに記入し、そのリストを保持すると、何かがうまくいきます。 しかし、私はこれが起こることを期待するでしょう魔法のようにによって休止状態。

何か間違っていますか? また、あまりにも多くの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; 
...  
} 

答えて

1

私はそれを最終的に試しました。 「didnの

@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; 
+0

これは私にとってはうまくいかなかった。問題は、Hibernateが永続化する前にAをBにセットすることを望んでいることです。これはうまくいきました:http://stackoverflow.com/questions/1795649/jpa-persisting-a-one-to-many-relationship –

0

は、あなたが間違った場所での属性updatable = false, insertable = falseを使用していたと私はそれを修正し、次のように

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

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

hereを読み、それらの仕組みを理解してください。

+0

こんにちはManuPK、 あなたのための 感謝答えが、私の問題を解決しませんでした。 (A)を永続化しようとしているときに、BのAIDがnullであるというエラーが発生しています。 ConstraintViolationImpl {interpolatedMessage = 'nullでないかもしれません'、のPropertyPath = AID、rootBeanClass =クラスcom.test.model.B、messageTemplate = '{javax.validation.constraints.NotNull.message}'} 私はわかりませんSQL Server側では、ID(AとB)の両方をIDとして持つ必要がありますか、またはHibernateがそれを処理しますか?しかし、私はそれがFKに不平を言っていると不平を言っていないので、それは大丈夫だと仮定しています。 – WonkeyDonkey

+0

DBは次のように探しています: 表1:AAA IdがnullではないBIGINT、 名前はvarchar(100) 表2:BBB Idは、 援助BIGINTがnullではない、 名varchar型のnullではないBIGINT(100) ありがとう! – WonkeyDonkey

+0

私はDBに戻り、AIdから 'not null'を削除し、Bクラスのidから @NotNullも削除しました。今度は持続は成功ですが、私はDBを見ています。 AAAはすべていいですが、BBBにはAIdがありません。 Help .. – WonkeyDonkey

関連する問題