Моя проблема совпадает с описанный в [1] или [2]. Я должен вручную установить автоматически сгенерированным значением значения по умолчанию (почему? импорт старых данных). Как описано в [1] использование Hibernate entity = em.merge(entity)
добьется цели.
К сожалению для меня это не делает. Я ни получаю ошибку, ни любое другое предупреждение. Объект просто не собирается появляться в базе данных. Я использую Spring и В спящем режиме EntityManager, С 3.5.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
.Согласно Выборочно отключите генерацию новой темы ID на форумах Hibernate, merge()
может быть не решением (по крайней мере, не в одиночку), и вам, возможно, придется использовать пользовательский генератор (это вторая ссылка, которую вы разместили).
Я не тестировал это сам, поэтому не могу подтвердить, но рекомендую прочитать тему форумов Hibernate.
Вам нужна текущая транзакция.
Если ваша транзакция управляется вручную:
entityManager.getTransaction().begin();
(конечно, не забудьте зафиксировать)
Если вы используете декларативные транзакции, используйте соответствующее объявление (скорее всего, через аннотации)
Также установите уровень ведения журнала гибернации на debug
( log4j.logger.org.hibernate = debug
) в вашем log4j.properties, чтобы отслеживать происходящее более подробно.