JPA OneToMany和ManyToOne抛出:实体列映射中的重复列(应使用insert ="false"update ="false"进行映射)

Öme*_* AK 49 java hibernate jpa one-to-many many-to-one

我有三个类,其中一个名称是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 User user;
 }

    public class APost extends Post {

     @ManyToOne(fetch=FetchType.LAZY) 
     public User user;
 }
Run Code Online (Sandbox Code Playgroud)

它的工作方式与此类似,但在db中生成emty表.哪个必须包含外键.当我尝试使用mappedBy和JoinColumn annotains时,我失败了.我该如何解决这个问题?

额外的信息:

当我换了;

 @ManyToOne(fetch=FetchType.LAZY)
 @JoinColumn(name="id")
 public User user;
Run Code Online (Sandbox Code Playgroud)

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

我越来越

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

最终编辑:最后,我对jpa注释完全错了.:(当我改变

@OneToMany(fetch=FetchType.LAZY, cascade = CascadeType.ALL, mappedBy="id")
Run Code Online (Sandbox Code Playgroud)

@OneToMany(fetch=FetchType.LAZY, cascade = CascadeType.ALL, mappedBy="user")
Run Code Online (Sandbox Code Playgroud)

@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="user_id")
Run Code Online (Sandbox Code Playgroud)

everthing工作正常.:)

Adr*_*hum 65

我不确定你的问题("空表"等的含义,或者如何mappedByJoinColumn不工作).

我认为你试图建立双向关系.

首先,你需要决定哪一方"拥有"这种关系.Hibernate将在这方面建立关系基础.例如,假设我让Post方拥有关系(我正在简化你的例子,只是为了保持关键),映射将如下所示:

(希望语法是正确的.我只是通过记忆来编写它们.但是这个想法应该没问题)

public class User{
    @OneToMany(fetch=FetchType.LAZY, cascade = CascadeType.ALL, mappedBy="user")
    private List<Post> posts;
}


public class Post {
    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="user_id")
    private User user;
}
Run Code Online (Sandbox Code Playgroud)

通过这样做,表格Post将具有user_id存储关系的列.休眠越来越由关系userPost(而不是postsUser.如果你有你会发现其中的差别Postuser,但缺少Userposts).

你提到过mappedBy并且JoinColumn没有工作.但是,我相信这实际上是正确的方法.请告诉我这种方法是否适用于您,并提供有关该问题的更多信息.我认为问题是由于其他原因造成的.


编辑:

关于使用的一些额外信息,mappedBy因为它通常会引起混淆.在mappedBy,我们将"属性名称"放在双向关系的对面,而不是表列名.

  • @WowBow只是因为他的问题仅与双向映射的方式有关,而与多对一关系无关.不会更新答案,因为我希望保持答案远离与问题无关的不必要的分心.如果您有其他问题,请随意将其作为另一个问题提出. (2认同)
  • @WowBow如果你的问题是关于如何拥有2个子类,并且你想在`User`中有方法来获得相应的`aPosts`和`bPosts`,那么有很多方法.我个人的偏好是简单:让`User`与`Post`有一对多的关系,并通过运行时过滤内部`Collection为`getAPosts()`和`getBPosts()`提供getter <后>`.您也可以像OP一样执行此操作,同时将APost和BPost视为完全不同的实体并维护其自己的"用户"关系(只有使用描述的方式定义2个OneToMany关系). (2认同)

Vla*_*cea 28

正如我在本文和我的书" 高性能Java持久性"中所解释的那样,您不应该使用单向@OneToMany注释,因为:

  1. 它会生成效率低下的SQL语句
  2. 它创建了一个额外的表,增加了数据库索引的内存占用量

现在,在你的第一个例子中,双方都拥有这种关联,这很糟糕.

虽然@JoinColumn会让@OneToMany负责该协会的方面,但它绝对不是最好的选择.因此,始终使用侧面的mappedBy属性@OneToMany.

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;
}
Run Code Online (Sandbox Code Playgroud)