JPA OneToMany和ManyToOne关系 [英] JPA OneToMany and ManyToOne Relationships

查看:563
本文介绍了JPA OneToMany和ManyToOne关系的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有三个类,一个名字是User,这个用户有其他的类实例。像这样;

  public class User {
@OneToMany(fetch = FetchType.LAZY,cascade = CascadeType.ALL)
public List< APost> aPosts;

@OneToMany(fetch = FetchType.LAZY,cascade = CascadeType.ALL)
public List< BPost> bPosts;
}




public class BPost extends Post {

@ManyToOne(fetch = FetchType.LAZY)
公共用户用户;
}

public class APost extends Post {

@ManyToOne(fetch = FetchType.LAZY)
public用户用户;
}

它是这样工作的,但在db中生成emty表。其中必须包含外键。当我尝试使用mappedBy和JoinColumn annotains时,我失败了。如何解决这个问题?



额外信息: ;

  @ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name =id)
公共用户用户;

  @OneToMany(fetch = FetchType.LAZY,cascade = CascadeType.ALL,mappedBy =id)
public List< APost> aPosts;

我得到



JPA错误发生(无法构建EntityManagerFactory):实体映射中的重复列:models.post.APost column:id(应该使用insert =falseupdate =false映射)

最终修改:最后,我对jpa注释完全错了。 :(当我更改

  @OneToMany(fetch = FetchType.LAZY,cascade = CascadeType.ALL,mappedBy =id) 

  @OneToMany(fetch = FetchType.LAZY,cascade = CascadeType.ALL,mappedBy =user)

  @ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name =user_id )

everthing可以正常工作:)

解决方案

正如我在这篇文章,并在我的书中高性能Java持久性,您不应该使用单向 @OneToMany 注释,因为:


  1. 它生成低效的SQL语句

  2. 它会创建一个额外的表h会增加数据库索引的内存占用空间现在,在第一个示例中,双方都拥有该关联,并且这很糟糕。



    虽然 @JoinColumn 会让 @OneToMany 一方负责关联,但它绝对不是最好的选择。因此,请始终在 @OneToMany 一侧使用 mappedBy 属性。

      public class User {
    @OneToMany(fetch = FetchType.LAZY,cascade = CascadeType.ALL,mappedBy =user)
    public List< APost> ; aPosts;

    @OneToMany(fetch = FetchType.LAZY,cascade = CascadeType.ALL,mappedBy =user)
    public List< BPost> bPosts;
    }

    public class BPost extends Post {

    @ManyToOne(fetch = FetchType.LAZY)
    public用户用户;
    }

    public class APost extends Post {

    @ManyToOne(fetch = FetchType.LAZY)
    public用户用户;
    }


    I have three classes one of the name is User and this user have other classes instances. Like this;

    public class User{
        @OneToMany(fetch=FetchType.LAZY, cascade = CascadeType.ALL)
        public List<APost> aPosts;
    
        @OneToMany(fetch=FetchType.LAZY, cascade = CascadeType.ALL)
        public List<BPost> bPosts;
    }
    
    
    
    
       public class BPost extends Post {
    
        @ManyToOne(fetch=FetchType.LAZY)    
        public User user;
     }
    
        public class APost extends Post {
    
         @ManyToOne(fetch=FetchType.LAZY) 
         public User user;
     }
    

    it's working like this but generates emty tables in db. Which have to contains foreign keys. When I tried to use mappedBy and JoinColumn annotains I got failed. How can I resolve this?

    Extra information:

    When I changed with;

     @ManyToOne(fetch=FetchType.LAZY)
     @JoinColumn(name="id")
     public User user;
    

    and

     @OneToMany(fetch=FetchType.LAZY, cascade = CascadeType.ALL, mappedBy="id")
     public List<APost> aPosts;
    

    I'm getting

    A JPA error occurred (Unable to build EntityManagerFactory): Repeated column in mapping for entity: models.post.APost column: id (should be mapped with insert="false" update="false")

    Final Edit: Finally, I was totaly wrong about jpa annotaions. :( When i change

    @OneToMany(fetch=FetchType.LAZY, cascade = CascadeType.ALL, mappedBy="id")
    

    to

    @OneToMany(fetch=FetchType.LAZY, cascade = CascadeType.ALL, mappedBy="user")
    

    and

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="user_id")
    

    everthing works ok. :)

    解决方案

    As I explained in this article and in my book, High-Performance Java Persistence, you should never use the unidirectional @OneToMany annotation because:

    1. It generates inefficient SQL statements
    2. It creates an extra table which increases the memory footprint of your DB indexes

    Now, in your first example, both sides are owning the association, and this is bad.

    While the @JoinColumn would let the @OneToMany side in charge of the association, it's definitely not the best choice. Therefore, always use the mappedBy attribute on the @OneToMany side.

    public class User{
        @OneToMany(fetch=FetchType.LAZY, cascade = CascadeType.ALL, mappedBy="user")
        public List<APost> aPosts;
    
        @OneToMany(fetch=FetchType.LAZY, cascade = CascadeType.ALL, mappedBy="user")
        public List<BPost> bPosts;
    }
    
    public class BPost extends Post {
    
        @ManyToOne(fetch=FetchType.LAZY)    
        public User user;
    }
    
    public class APost extends Post {
    
         @ManyToOne(fetch=FetchType.LAZY) 
         public User user;
    }
    

    这篇关于JPA OneToMany和ManyToOne关系的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆