JPA中的双向关系

我有两个实体类,User和MyCharacter。用户有一个MyCharacters列表,每个MyCharacter都有一个返回给用户(所有者)的引用。我想要完成的是,我对两个关系都使用相同的连接表,这意味着在MyCharacter中找到的所有者关系将自动使用与User => MyCharacter相同的连接表。这意味着MyCharacter中的getOwner()方法应该可以工作,而不必在某些时候显式调用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;
    }
}
    
已邀请:
这就是我们如何在项目中使用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;
    }   
}
    
我不确定我是否正确理解你的问题,但你可以尝试在MyCharacter.owner上设置mappedBy:
@ManyToOne(mappedBy="characters")
    
以下是Oracle的一篇文章,它解释了如何映射这种关系。 当你在Java中使用它时,根据你的JPA框架,你需要将
MyCharacter
添加到
User
的列表中并在
MyCharacter
中设置
user
字段或者只设置两个中的一个(因为框架将为你管理另一面) 。我建议写一个小测试来弄清楚哪些有效(并且你应该为你使用对象的所有方式编写测试用例)。 从数据库加载对象时,您不需要这样做,因为所有框架都正确处理了这种情况。     

要回复问题请先登录注册