em.merge не генерирует заявление об обновлении - PullRequest
0 голосов
/ 20 мая 2011

Я использую JPA 2.0 и hibernate в проекте и столкнулся с проблемой: 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, который по умолчанию имеет TransactionalAttribute.REQUIRED.

Ответы [ 2 ]

1 голос
/ 20 мая 2011

Есть пара вещей, которые могут пойти не так, но вам нужно будет проверить / показать нам журналы того, что происходит, чтобы быть уверенным.Если вы этого еще не сделали, вам следует включить запись в журнал для отладки (что-то вроде этого в log4j.properties):

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

и включить show sql (в модуле постоянства в persistence.xml):

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

Кроме того, нам нужно увидеть контекст слияния - я полагаю, что это dones внутри управляемого бина Spring?Кроме того, вы пометили метод, который вызывает em.merge () как @Transactional?если вы не находитесь в допустимой транзакции, она, вероятно, не сможет сохранить ее довольно тихо


ОБНОВЛЕНО:

Где метод, содержащий em.merge () звонят из?

Аннотация TransactionalAttribute.REQUIRED не создает новую транзакцию, поэтому она не будет работать, если вы уже не в транзакции (например, вызывающий метод аннотирован @Transactional).

Попробуйте аннотировать метод с помощью @Transactional, или вы можете использовать TransactionalAttribute.REQUIRES_NEW - хотя вам следует подумать, что это означает, что он всегда будет создавать новую транзакцию независимо от того,

0 голосов
/ 20 мая 2011

Я думаю, вам не хватает настроек каскада .. попробуйте -

@ManyToOne(fetch = FetchType.LAZY, optional = false, cascade = CascadeType.ALL)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...