![](/img/trans.png)
[英]MappingException: Repeated column in mapping for entity: ... column: dept_id (should be mapped with 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_id
和author
)。 这是不允许的,因为如果它们有不同的值,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 实例,因此您可以简单地使用它来配置新书的作者。
如果你真的想节省一个数据库调用来获取作者,你可以考虑使用EntityManager
的getReference()
来获取作者代理,这样你就可以用它来配置新书的作者:
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.