繁体   English   中英

MappingException 实体映射中的重复列:models.Book 列:author_id(应使用 insert="false" update="false" 进行映射)

[英]MappingException Repeated column in mapping for entity: models.Book column: author_id (should be mapped with insert="false" update="false")

我总是有一个例外,当我试图

Book book = new Book(); 
book.setAuthor_id(4);
book.setTitle("test");

作者class:

public class Author {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private long id;

    @Column(name = "name")
    private String name;

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "author")
    private Set<Book> books;
    // getters and setters

预订class:

public class Book {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private long id;

    @Column(name = "title")
    private String title;

    @Column(name = "author_id")
    private long author_id;

    @ManyToOne(optional = false, cascade = CascadeType.ALL)
    @JoinColumn(name = "author_id")
    private Author author;
    //getters and setters

我在没有private long author_id的情况下尝试,但后来我无法设置作者 ID 我该如何解决?

这是因为您将 map author_id列添加到Book中的多个非只读字段( author_idauthor )。 这是不允许的,因为如果它们有不同的值,Hibernate 在更新/插入其值时不知道应该为author_id列使用哪个值。

因此,要么删除其中之一,要么将其中之一配置为只读:

要将author_id配置为只读,您可以执行以下操作:

@Column(name = "author_id" , insertable=false, updatable=false)
private long author_id;

要将Author配置为只读,您可以执行以下操作:

@ManyToOne(optional = false, cascade = CascadeType.ALL)
@JoinColumn(name = "author_id", insertable=false, updatable=false)
private Author author;

更好的解决方案是确保只有一个字段映射到author_id ,所以我会删除author_id字段。

要为一本书配置作者,最好先从数据库中查询作者。 它还可以帮助验证具有给定 Id 的作者是否真的存在。 否则,如果没有具有该 ID 的作者,则在保存 Book 时将违反其 FK 约束。 由于您已经获得 Author 实例,因此您可以简单地使用它来配置新书的作者。

如果你真的想节省一个数据库调用来获取作者,你可以考虑使用EntityManagergetReference()来获取作者代理,这样你就可以用它来配置新书的作者:

Author author = entityManager.getReference(Author.class , 4);

Book book = new Book(); 
book.setAuthor(author);
book.setTitle("test");

另请参阅以了解有关getReference()行为的更多详细信息

暂无
暂无

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

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