Двустороннее отношение в JPA - PullRequest
1 голос
/ 10 апреля 2009

У меня есть два класса сущностей, User и MyCharacter. У пользователя есть список MyCharacter, и у каждого MyCharacter есть ссылка на пользователя (владельца). Я хотел бы, чтобы я использовал одну и ту же таблицу соединений для обоих отношений, а это означает, что отношение владельца, найденное в MyCharacter, будет автоматически использовать ту же таблицу соединений, что и в User => MyCharacter. Это означает, что метод getOwner () в MyCharacter должен работать без необходимости явного вызова setOwner (user) в какой-то момент.

Чтобы очистить это немного, вот мой модульный тест, который в настоящее время не проходит (последнее утверждение не выполнено)


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

Ответы [ 3 ]

2 голосов
/ 10 апреля 2009

Вот как мы объединяем две сущности с 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;
    }   
}
1 голос
/ 10 апреля 2009

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

@ManyToOne(mappedBy="characters")
0 голосов
/ 10 апреля 2009

Вот статья от Oracle, в которой объясняется, как отображать такие отношения.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...