em.merge不生成更新语句

时间:2011-05-20 13:44:56

标签: java hibernate constraints

我在项目中使用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

2 个答案:

答案 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)