2009-04-10 5 views
1

J'ai les deux classes d'entités, User et MyCharacter. L'utilisateur a une liste de MyCharacters et chaque MyCharacter a une référence à l'utilisateur (propriétaire). Ce que j'aimerais accomplir, c'est que j'utilise la même table de jointure pour les deux relations, ce qui signifie que la relation propriétaire trouvée dans MyCharacter utiliserait automatiquement la même table de jointure que User = > MyCharacter. Cela signifie que la méthode getOwner() dans MyCharacter devrait fonctionner sans que je doive appeler explicitement setOwner (utilisateur).Relation bidirectionnelle dans JPA

Pour effacer ce un peu plus, voici mon test unitaire qui échoue actuellement (dernière assert échoue)


@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()); 
} 

Mes classes d'entités sont listées ci-dessous.


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

Répondre

2

Voilà comment nous joignons deux entités JPA dans notre projet:

@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 d'Oracle qui explique comment mapper de telles relations.

Lorsque vous utilisez ce en Java, en fonction de votre cadre de JPA, vous devrez ajouter le MyCharacter à la liste Useret définir le champ user dans MyCharacter ou seulement l'un des deux (parce que le cadre administrera l'autre côté pour vous). Je suggère d'écrire un petit test pour comprendre ce qui fonctionne (et vous devriez écrire des cas de test pour toute la façon dont vous utilisez vos objets, de toute façon).

Lorsque des objets sont chargés à partir de la base de données, vous n'avez pas besoin de le faire car tous les frameworks gèrent correctement ce cas.

1

je ne suis pas sûr que je comprends bien votre problème, mais vous pouvez essayer de mettre mappedBy sur MyCharacter.owner:

@ManyToOne(mappedBy="characters") 
Questions connexes