繁体   English   中英

JPA OneToMany 和 ManyToOne throw:实体列映射中的重复列(应映射为 insert=“false” update=“false”)

[英]JPA OneToMany and ManyToOne throw: Repeated column in mapping for entity column (should be mapped with insert=“false” update=“false”)

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

它像这样工作,但在数据库中生成空表。 其中必须包含外键。 当我尝试使用mappedByJoinColumn注释时,我失败了。 我该如何解决这个问题?

额外的信息:

当我改变了;

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

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

我越来越

发生 JPA 错误(无法构建 EntityManagerFactory):实体映射中的重复列:models.post.APost 列:id(应映射为 insert="false" update="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")

一切正常。 :)

我不太确定你的问题(“空表”等的含义,或者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;
}

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

您提到了mappedByJoinColumn不起作用。 但是,我相信这实际上是正确的方法。 请告诉我们这种方法是否对您不起作用,并为我们提供有关该问题的更多信息。 我相信问题是由于其他原因造成的。


编辑:

关于mappedBy的使用的一些额外信息,因为它起初通常令人困惑。 mappedBy ,我们将“属性名称”放在双向关系的另一侧,而不是表列名称。

你永远不应该使用单向@OneToMany注释,因为:

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

现在,在您的第一个示例中,双方都拥有该协会,这很糟糕。

虽然@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 User user;
}

public class APost extends Post {

     @ManyToOne(fetch=FetchType.LAZY) 
     public User user;
}

由于您将直接保存APost和BPost,这意味着APost和BPost将成为关系所有者。 由于用户不拥有该关系,因此@OneToMany注释中将存在属性mappedBy。

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

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

public class BPost extends Post {
    @ManyToOne(fetch=FetchType.LAZY)  
    @JoinColumn(name="user_id",referencedColumnName="id")  
    public User user;
}

public class APost extends Post {
    @ManyToOne(fetch=FetchType.LAZY) 
    @JoinColumn(name="user_id",referencedColumnName="id")
    public User user;
}

@JoinColumn注释将负责在Apost和BPost中添加外键。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM