我在项目中使用JPA 2.0和hibernate并遇到了问题: em.merge()不生成更新语句。
详细情况是: 我有一个实体,它已成功保留。它在其他实体上有一个外键,映射如下:
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "ENTITY2_ID", referencedColumnName = "ID")
@ForeignKey(name = "FK_ENTITY2_PS")
private Entity2 entity2;
它稍后创建并持久化。之后我做了
entity1.setEntity2(entity2);
em.merge(entity1);
并查看日志:hibernate没有为此生成更新语句,我的应用程序因约束违规而崩溃。这是一个错误吗?或者我做错了什么?
UPD
日志已打开,我看到插入。
em.merge()
发生的方法是@Stateless
bean内部,默认情况下这些方法有TransactionalAttribute.REQUIRED
。
答案 0 :(得分:1)
有些事情可能会出错,但您需要检查/向我们展示最新情况。如果你还没有,你应该把你的日志记录变成调试(在log4j.properties中是这样的):
log4j.logger.net.sf.hibernate=debug
log4j.logger.net.sf.hibernate.SQL=debug
并打开show sql(在persistence.xml中的持久性单元中):
<property name="hibernate.show.sql" value="true" />
此外,我们需要查看合并的上下文 - 我认为它是在Spring托管bean中的内容?另外,您是否已将标记为em.merge()的方法标记为@Transactional?如果你不在一个有效的交易中,它可能无法以默默的方式持续存在
<强>更新:强>
包含从中调用em.merge()的方法在哪里?
注释TransactionalAttribute.REQUIRED不会创建新的Transaction,因此除非您已经在Transaction中,否则这将不起作用(例如,调用方法注释为@Transactional)。
尝试使用@Transactional对方法进行分析,或者您可以使用TransactionalAttribute.REQUIRES_NEW - 尽管您应该认为通过它意味着它将始终创建新的事务
答案 1 :(得分:0)
我认为你错过了级联设置..试试 -
@ManyToOne(fetch = FetchType.LAZY, optional = false, cascade = CascadeType.ALL)