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)
精彩评论