Я использую JPA 1.0 (спящий режим) вместе с базой данных MySql.Отключенный объект Hibernate JPA сохраняется
project=em.find(Project.class,projectTO.getProjectID());
System.out.println("after find "+em.contains(project));
печатает true
, как find()
возвращает управляемый объект состояния.
em.detach(project);
System.out.println("after detach "+em.contains(project));
печатает false
как объект находится в настоящее время в отдельном состоянии
em.getTransaction().begin();
em.persist(project);
Здесь я пытаюсь сохраняться удаленными объектами. Поэтому он должен дать IllegalStateException
. Но здесь он дает MySQLIntegrityConstraintViolationException
, поскольку он пытается сохранить уже существующие данные.
System.out.println("after persist "+em.contains(project));
печатает true
как объект находится в управляемом состоянии.
em.getTransaction().commit();
Так мой вопрос, почему отдельно стоящий объект становится сохранялось? Почему я не получаю это IllegalStateException
в соответствии с документами?
Как определяется сущность? Имеет ли он сгенерированный идентификатор ('@ GeneratedValue')? У него есть поле версии ('@ Version')? Если в нем нет ни одного из них, Hibernate не может отделить отдельный объект от переходного. –
@JBNizet Я не использовал никаких аннотаций как '@ GeneratedValue' или' @ Version'. Бобы заполняются вручную. –
В этом случае, как я уже сказал, Hibernate не может отличить отсоединенную, уже постоянную сущность с идентификатором 56 от временного объекта, который вы хотите вставить с идентификатором 56. Поскольку вы вызываете persist(), он предполагает, что он временный и пытается чтобы вставить его. –