【发布时间】:2018-04-03 18:58:40
【问题描述】:
我有两个简单的实体(getter/setter 被省略):
@Entity
public class Paper {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
}
和
@Entity
public class Writer {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@OneToMany
private List<Paper> book1 = new ArrayList<>();
@OneToMany
private List<Paper> book2 = new ArrayList<>();
}
Hibernate 创建一个具有 3 列(writer_id、book1_id、book2_id)的中间表 writer_paper。但是我不能在书中添加任何论文,因为它违反了第二本书的非空约束。我可以以某种方式放弃或规避这个约束吗?谢谢。
更新
我正在尝试将论文添加到这样的第一本书中:
Session session = sfbean.getSessionFactory().openSession();
session.beginTransaction();
Writer writer = new Writer();
Paper paper = new Paper();
session.saveOrUpdate(writer);
session.saveOrUpdate(paper);
writer.getBook1().add(paper);
session.saveOrUpdate(writer);
session.getTransaction().commit();
session.close();
错误堆栈跟踪的一部分:
原因:org.postgresql.util.PSQLException:错误:“book2_id”列中的空值违反了 NOT NULL 约束
详细信息:错误的字符串包含 (670, null, 671)。
【问题讨论】:
-
也许是我的错,但是..我不明白两个书单对作家的目的..作家只有两本书吗?我不清楚触发错误的操作。您应该编写对触发错误的实体执行的操作/命令,并复制错误的有用部分。从您的描述中不清楚您的用例。请完善更多细节。
-
@FabianoTarlao,这是一个演示错误的纯粹示例,因此作者拥有多少本书并不重要(真实的代码快照应该太冗长)。我用你要求的信息更新了一个帖子
-
很奇怪,OT:我期待一个不同的表映射。也许参考 JPA(.. 并且通常我手动定义大多数表映射)执行不同,或者我没有很好地提醒。我认为您现在已经添加了所有需要的信息,以便其他“休眠”人员回答您的问题。出于好奇,让我们尝试添加 writer.getBook2().add(paper);在 writer.getBook1().add(paper) 之后; ...并查看错误是否消失。在此处发布案例.. 它可能有助于其他人跟踪问题。问候
-
感谢您的回复。我添加了 writer.getBook2().add(paper) 但它因同样的错误而失败。 Hibernate 尝试分别为每本书添加纸张(例如 (670, null, 671) 然后 (670, 671, null))
-
这又是一个有用的证明,让我们等待其他比我更有能力的人:-)