2011-05-20 30 views
0

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

+0

你可能做错了什么。该问题可能是由于ConstraintViolationException。 – 2011-05-20 13:48:04

+0

从哪里调用包含em.merge()的方法?注释TransactionalAttribute.REQUIRED不会创建新的事务,因此除非您已经在事务中(例如,调用方法注释为@Transactional),否则这将不起作用。尝试使用@Transactional来排列方法,或者使用TransactionalAttribute。REQUIRES_NEW - 虽然你应该认为通过它意味着它总是会创建一个新的事务 – rhinds 2011-05-20 14:44:30

+0

另外,虽然它不会导致这个问题,但我通常避免使用merge(),除非处理分离的实体 - 如果加载任何对象在事务内部,一旦事务完成,在同一事务中对该对象所做的任何更改都将自动保留,请参阅已更新的问题 – rhinds 2011-05-20 17:11:40

回答

1

有几件事情可能会出错,但是您需要检查/向我们显示正在发生的事情的日志。如果你还没有已经,你应该把你的日志最多调试(这样的事情在log4j.properties):

log4j.logger.net.sf.hibernate=debug 
log4j.logger.net.sf.hibernate.SQL=debug 

和(persistence.xml中持久化单元)打开显示SQL:

<property name="hibernate.show.sql" value="true" /> 

另外,我们需要看到合并的上下文 - 我认为它是在Spring管理bean内完成的?另外,你是否标记了调用em.merge()作为@Transactional的方法?如果你不是一个有效的事务里面可能会失败坚持它非常默默


更新:

凡em.merge()被称为自包含的方法是什么?

注释TransactionalAttribute.REQUIRED不会创建新的事务,所以除非您已经在事务中(例如调用方法注释@Transactional),否则这将不起作用。

尝试anotating与@Transactional的方法或者你可以使用TransactionalAttribute.REQUIRES_NEW - 尽管你应该认为通过,因为它意味着它永远创建一个新的事务不管

+0

。 – 2011-05-20 14:22:40

0

我想你错过了级联设置..尝试 -

@ManyToOne(fetch = FetchType.LAZY, optional = false, cascade = CascadeType.ALL)