开发者

em.merge doesn't generate update statement

I'm using JPA 2.0 and hibernate in the project and faced the problem: em.merge() doesn't generate the update statement.

The detail situation is: I have an entity, which is successfully persisted. It has a foreign key on other entity, mapped like:

@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "ENTITY2_ID", referencedColumnName = "ID")
@ForeignKey(name = "FK_ENTITY2_PS")
private Entity2 entity2;

It is created a bit later and persisted too. After that I make

entity1.setEntity2(entity2);
em.merge(entity1); 

and see the log: hibernate doesn't generate the update statement for that and my application crashes with constraint violation. Is this a bug? Or am I doing something wrong?

UPD The logging is turned on and I see inserts there. The method where em.mer开发者_StackOverflow社区ge() occurs is inside @Stateless bean, which methods have TransactionalAttribute.REQUIRED by default.


There are a couple of things that could be going wrong, but you would need to check/show us the logs of whats going on to be sure. If you havent already, you should turn your logging up to debug (something like this in log4j.properties):

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

and turn on show sql (In the persistence unit in persistence.xml):

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

Also, we would need to see the context of the merge - I assume it is being dones inside a Spring managed bean? Also, have you marked the method that calls em.merge() as @Transactional? if you are not inside a valid transaction it will probably fail to persist it pretty silently


UPDATED:

Where is the method that contains em.merge() being called from?

The annotation TransactionalAttribute.REQUIRED does not create a new Transaction, so this will not work unless you are already in a Transaction (e.g. the calling method is annotated @Transactional).

Try anotating the method with @Transactional or you could use TransactionalAttribute.REQUIRES_NEW - although you should think that through as it means it will always create a new transaction whatever


I think you're missing cascade settings.. try -

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜