代码之家  ›  专栏  ›  技术社区  ›  KCL

JPA中的双向关系

  •  1
  • KCL  · 技术社区  · 16 年前

    我有两个实体类,user和mycharacter。用户有一个mycharacters列表,每个mycharacter都有一个对用户(所有者)的引用。我要完成的是,我对两个关系使用相同的联接表,这意味着在mycharacter中找到的所有者关系将自动使用与user=>mycharacter中相同的联接表。这意味着mycharacter中的getowner()方法应该可以工作,而不必在某个点调用setowner(用户)。

    为了更清楚一点,这里是我的单元测试,它当前失败(最后一个断言失败)

    
    @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 回复  |  直到 16 年前
        1
  •  2
  •   Vanger    16 年前

    这就是我们在项目中如何将两个实体与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;
        }   
    }
    
        2
  •  1
  •   miceuz    16 年前

    我不确定我是否正确理解您的问题,但您可以尝试在mycharacter.owner上设置mappedby:

    @ManyToOne(mappedBy="characters")
    
        3
  •  0
  •   Aaron Digulla    16 年前

    Here is an article 来自Oracle,它解释了如何映射这种关系。

    当您在Java中使用此时,取决于您的JPA框架,您需要添加 MyCharacter 列入名单 User 设置 user 字段在 我的性格 或者只有其中一个(因为框架将为您管理另一方)。我建议编写一个小测试来找出什么有效(无论如何,您应该为使用对象的所有方式编写测试用例)。

    当从数据库加载对象时,您不需要这样做,因为所有框架都正确地处理这种情况。