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.merge() 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):
and turn on show sql (In the persistence unit in persistence.xml):
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