2009-04-10 3 views
1

У меня есть два класса сущностей: User и MyCharacter. Пользователь имеет список MyCharacters, и каждый MyCharacter ссылается на пользователя (владельца). То, что я хотел бы сделать, заключается в том, что я использую ту же таблицу соединений для обоих отношений, что означает, что отношение владельца, найденное в MyCharacter, автоматически будет использовать ту же таблицу соединений, что и от User = > MyCharacter. Это означает, что метод getOwner() в MyCharacter должен работать без меня, чтобы явным образом в какой-то момент вызывал setOwner (пользователь).Двустороннее отношение в 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 в нашем проекте:

@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 от Oracle, который объясняет, как сопоставить такие отношения.

При использовании этого в Java, в зависимости от структуры JPA, вам нужно будет добавить MyCharacter к списку в Userи установить user поле в MyCharacter или только один из двух (так как структура будет управлять другая сторона для вас). Я предлагаю написать небольшой тест, чтобы выяснить, что работает (и вы должны писать тестовые примеры на все пути использования ваших объектов).

Когда объекты загружаются из базы данных, вам не нужно будет этого делать, поскольку все фреймворки правильно обрабатывают этот случай.

1

Я не уверен, я понимаю вашу проблему правильно, но вы можете попробовать установить mappedBy на MyCharacter.owner:

@ManyToOne(mappedBy="characters") 
Смежные вопросы