Обойдите GeneratedValue в, в спящем режиме (данные слияния не в дб?)

Моя проблема совпадает с описанный в [1] или [2]. Я должен вручную установить автоматически сгенерированным значением значения по умолчанию (почему? импорт старых данных). Как описано в [1] использование Hibernate entity = em.merge(entity) добьется цели.

К сожалению для меня это не делает. Я ни получаю ошибку, ни любое другое предупреждение. Объект просто не собирается появляться в базе данных. Я использую Spring и В спящем режиме EntityManager, С 3.5.3 финалом.

Какие-либо идеи?

36
задан Community 23 May 2017 в 11:33
поделиться

3 ответа

это работает на моем проекте со следующим кодом:

@XmlAttribute
@Id
@Basic(optional = false)
@GeneratedValue(strategy=GenerationType.IDENTITY, generator="IdOrGenerated")
@GenericGenerator(name="IdOrGenerated",
                  strategy="....UseIdOrGenerate"
)
@Column(name = "ID", nullable = false)
private Integer id;

и

import org.hibernate.id.IdentityGenerator;
...
public class UseIdOrGenerate extends IdentityGenerator {
private static final Logger log = Logger.getLogger(UseIdOrGenerate.class.getName());

@Override
public Serializable generate(SessionImplementor session, Object obj) throws HibernateException {
    if (obj == null) throw new HibernateException(new NullPointerException()) ;

    if ((((EntityWithId) obj).getId()) == null) {
        Serializable id = super.generate(session, obj) ;
        return id;
    } else {
        return ((EntityWithId) obj).getId();

    }
}

где вы в основном определяете свой собственный генератор ID (основанный на стратегии Identity), и если ID не установлен, вы делегируете генерацию генератору по умолчанию.

Главный недостаток в том, что он связывает вас с Hibernate в качестве JPA провайдера ... но он прекрасно работает с моим проектом MySQL

.
44
ответ дан 27 November 2019 в 05:13
поделиться

Согласно Выборочно отключите генерацию новой темы ID на форумах Hibernate, merge() может быть не решением (по крайней мере, не в одиночку), и вам, возможно, придется использовать пользовательский генератор (это вторая ссылка, которую вы разместили).

Я не тестировал это сам, поэтому не могу подтвердить, но рекомендую прочитать тему форумов Hibernate.

2
ответ дан 27 November 2019 в 05:13
поделиться

Вам нужна текущая транзакция.

Если ваша транзакция управляется вручную:

entityManager.getTransaction().begin();

(конечно, не забудьте зафиксировать)

Если вы используете декларативные транзакции, используйте соответствующее объявление (скорее всего, через аннотации)

Также установите уровень ведения журнала гибернации на debug ( log4j.logger.org.hibernate = debug ) в вашем log4j.properties, чтобы отслеживать происходящее более подробно.

1
ответ дан 27 November 2019 в 05:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: