2009-04-10 11 views
1

私は2つのエンティティクラスUserとMyCharacterを持っています。ユーザーにはMyCharactersのリストがあり、各MyCharacterにはユーザー(所有者)の参照が戻ってきます。私が達成したいのは、両方のリレーションに対して同じ結合テーブルを使用するということです。つまり、MyCharacterにある所有者の関係は、User = > MyCharacterと同じジョインテーブルを自動的に使用します。つまり、MyCharacterのgetOwner()メソッドは、明示的に何らかのポイントでsetOwner(user)を呼び出さなくても動作するはずです。JPAの双方向関係

このビット以上をクリアするには、ここでは、現在(最後のアサートが失敗した)


@Test 
public void testTwoWayRelation() { 
    User user = new User(); 
    MyCharacter character = new MyCharacter(); 
    List<MyCharacter> chars = new ArrayList<MyCharacter>(); 
    chars.add(character); 
    user.setCharacters(chars); 

    facade.store(user); 
    assertNotNull(character.getId()); 

    character = facade.find(MyCharacter.class, character.getId()); 

    assertNotNull(character.getOwner()); 
} 

私のエンティティクラスを以下に示します失敗した私のユニットテストです。


@Entity 
@Table(name = "myuser") 
public class User { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    protected Long id; 

    @OneToMany(cascade = { CascadeType.PERSIST }) 
    protected List<MyCharacter> characters; 

    public User() { 

    } 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 


    public List<MyCharacter> getCharacters() { 
     return characters; 
    } 

    public void setCharacters(List<MyCharacter> characters) { 
     this.characters = characters; 
    } 

} 


@Entity 
public class MyCharacter{ 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    protected Long id; 

    @ManyToOne 
    @JoinTable(name = "myuser_mycharacter", joinColumns = @JoinColumn(name = "characters_id"), inverseJoinColumns = { @JoinColumn(name = "user_id") }) 
    protected User owner; 

    public MyCharacter() { 

    } 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 


    public User getOwner() { 
     return owner; 
    } 

    public void setOwner(User owner) { 
     this.owner = owner; 
    } 
} 

答えて

2

私たちは私たちのプロジェクトにJPAとの2つのエンティティへの参加方法は次のとおりです。

@Entity 
    @Table(name = "Period") 
    public class Period implements Serializable { 
     private List<Delay> delays = new ArrayList<Delay>(); 

     @OneToMany(mappedBy="period") //name of the field in joined entity 
     public List<Delay> getDelays() { 
     return delays; 
     } 
    } 

    @Entity 
    @Table(name = "Delay") 
    public class Delay implements Serializable { 

    private Period period; 

    @ManyToOne 
    @JoinColumn(name = "PERIODID") 
    public Period getPeriod() { 
     return period; 
    } 
} 
0

Here is an articleこのような関係をマップする方法を説明します。フレームワークで管理するため

あなたはJavaでこれを使用すると、あなたのJPAのフレームワークに依存し、あなたがUserにリストにMyCharacterを追加する必要がありますがMyCharacterまたは2つだけの1(中userフィールドを設定しましたあなたのためにもう片面)。私は小さなテストを書いて、何がうまくいくかを理解することをお勧めします(とにかくオブジェクトを使用するすべての方法でテストケースを記述する必要があります)。

オブジェクトがデータベースからロードされるとき、すべてのフレームワークがこのケースを正しく処理するため、オブジェクトをデータベースからロードする必要はありません。

1

私が正しくあなたの問題を理解していないが、あなたはMyCharacter.ownerにmappedByを設定しようとすることができます:

@ManyToOne(mappedBy="characters") 
関連する問題