我在项目中使用JPA 2.0和休眠并面临问题: em.merge()不生成更新语句。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
。
你可能做错了什么。该问题可能是由于ConstraintViolationException。 – 2011-05-20 13:48:04
从哪里调用包含em.merge()的方法?注释TransactionalAttribute.REQUIRED不会创建新的事务,因此除非您已经在事务中(例如,调用方法注释为@Transactional),否则这将不起作用。尝试使用@Transactional来排列方法,或者使用TransactionalAttribute。REQUIRES_NEW - 虽然你应该认为通过它意味着它总是会创建一个新的事务 – rhinds 2011-05-20 14:44:30
另外,虽然它不会导致这个问题,但我通常避免使用merge(),除非处理分离的实体 - 如果加载任何对象在事务内部,一旦事务完成,在同一事务中对该对象所做的任何更改都将自动保留,请参阅已更新的问题 – rhinds 2011-05-20 17:11:40