2009-05-09 6 views
4

私は2つのテーブル間の多くの関係に多くを持っているし、休止状態 に新加入テーブルを生成するには、今私はレコードを挿入することができますどのように、両方のテーブル のupdatationでテーブルを結合する2台がtbluserあると多対多の休止状態注釈の結合テーブルにレコードを挿入するにはどうすればよいですか?

tbldomain私は挿入する必要が言います(つまり、tbluserとtbldomainから)

現在、私はtbluserを保存または更新するときにのみ結合テーブルにレコードを挿入できますが、ドメインテーブルの関係を更新するときにも レコードを挿入します

user.classドメインテーブルに、私はあなたのクラスがどのように見えるかどうエントリ

@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE},fetch=FetchType.EAGER, mappedBy = "virtualdomainset", targetEntity = User.class) 

public Set<User> getUserset() { 
     return userset; 
} 

public void setUserset(Set<User> userset) { 
     this.userset = userset; 
} 

答えて

0

がありますが、私は

@ManyToMany(targetEntity = VirtualDomain.class, cascade = {CascadeType.PERSIST, CascadeType.MERGE},fetch=FetchType.EAGER) 

@JoinTable(name = "tblUserDomainRel", joinColumns = @JoinColumn(name = "userid"), inverseJoinColumns = @JoinColumn(name = "domainid")) 

public Set<VirtualDomain> getVirtualdomainset() { 
     return virtualdomainset; 
} 

public void setVirtualdomainset(Set<VirtualDomain> virtualdomainset) { 
     this.virtualdomainset = virtualdomainset; 
} 

を書かれていますか?

あなたはクラスDomainとクラスUserがあるとします。 Domainクラスで、Usersコレクションがあるとします。 UsersコレクションをUserオブジェクトに追加し、DomainオブジェクトのSaveOrUpdateを呼び出します。 はまた、あなたが(例えばカスケーディングのために=「セーブ・アップデートを」正しいカスケードオプションを指定したことを確認してください。

SAは大きな絵をビット」は。私たちが働いていないものについて、より詳細な情報を必要としています。

+0

= FetchType.EAGER、mappedBy = "virtualdomainset"、targetEntity = User.class) \t公開セット getUserset(){ \t \t return userset;私はユーザBean内 \t} マッピング@ManyToMany(targetEntity = VirtualDomain.class、カスケード= {CascadeType.PERSIST、CascadeType.MERGE} = FetchType.EAGERフェッチ) \t @JoinTable(名= "tblUserDomainRel" 、joinColumns = @JoinColumn(名= "USERID")、inverseJoinColumns = @JoinColumn(名= "DOMAINID")) \t公衆セット<バーチャルドメイン> getVirtualdomainset(){ \t \tリターンvirtualdomainset。 \t} – lakhaman

+0

両方のクラスにsetterメソッドがありますが、サイズ制限のbacauseは含まれていません。 ユーザーのsaveメソッドやupdateメソッドを呼び出すことで正しく挿入できますが、ドメインテーブルのsaveメソッドやupdateメソッドを呼び出すことでレコードを挿入できません。 どうすればそれを達成できますか? – lakhaman

+0

詳細を提供するために質問を編集することができます。それはさらに読みやすくなっています。 :) –

0

あなたはUserクラスを関係者の所有者にしました。逆の場合は、Domaintableが@JoinTableを持つようにマッピングを切り替える必要があります。あるいは、@PrePersistまたは@PreUpdate onを使用して手動で強制する必要があります。 Domaintableは強制的にユーザーの更新を呼び出して、その行を結合表に挿入します。これを実現する他の方法はあると確信していますが、それは思い浮かぶ2つの点です。

@PreUpdate example : 

@EntityListeners(Domaintable.class) 
@Entity 
public class Domaintable 
{ 

User user; 

.... 

@PreUpdate 
public void onPreUpdate(DomainTable domainTable) 
{ 
    if(domainTable.getUser() != null) 
    { 
     entitymanager.update(domainTable.getUser()); 
    } 
} 

.... 

} 
私はあなたが最初のハードルで転倒することができる疑う
+0

どのようにprePersist注釈を使用することができます私はこのタグで割り当てる必要があるいくつかのアイデアを提供してください – lakhaman

+0

投稿を更新 – ccclark

9

前述したように、Hibernateはルールを以下の、あなたは上update()を呼び出してから、更新を必要とするすべての後続のオブジェクトまでカスケード接続オブジェクトを更新します@Cascade属性で指定します。

問題は、あなたのUserクラスは関係を所有し、VirtualDomain.usersetコレクションにUserオブジェクトを追加すると、どのような方法でUserオブジェクトを変更しないということです。したがって、カスケードであっても、Hibernateは、Userオブジェクトを更新することはありません。

代わりに、オブジェクトをVirtualDomain.usersetコレクションに追加するときは、VirtualDomainUser.virtualdomainsetコレクションに追加されていることを確認してください。このような場合には

// given a VirtualDomain object 
VirtualDomain domain = getSession().load(VirtualDomain.class, 1234); 

// and a User object 
User user = getSession().load(User.class, 5678); 

// add the User to the VirtualDomain 
domain.getUserset().add(user); 
// but also add the VirtualDomain to the user 
user.getVirtualdomainset().add(domain); 

// update the VirtualDomain and the Cascade settings will also update the User 
getSession().update(domain); 

私はそれが便利なコレクションにオブジェクトを追加するのではなく、コレクションそのものへの直接アクセスを使用するためのヘルパーメソッドを提供するために見つけます。例えば

public class VirtualDomain { 

    Set userset; 

    /* snip... */ 

    public void addUser(User user) { 
     getUserset().add(user); 
     user.getVirtualdomainset().add(this); 
    } 
} 

それはHibernateのフォア父親のアドバイスを覚えておく価値だが:

「実際のシステムでは、あなたは多対多の関連を持っていないかもしれません私たちの経験があることがあります。ほとんどの場合、各リンクに接続する必要があるその他の情報...最善の方法は... アソシエーションクラスの中間経由です。 (HibernateでのJava永続性、P。298分の297、ISBN 1-932394-88-5)iがマッピング \t @ManyToMany(カスケード= {CascadeType.PERSIST、CascadeType.MERGE}、フェッチを有するドメイン豆に

関連する問題