2014-08-19 4 views
0

Я использую 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 в соответствии с документами?

+0

Как определяется сущность? Имеет ли он сгенерированный идентификатор ('@ GeneratedValue')? У него есть поле версии ('@ Version')? Если в нем нет ни одного из них, Hibernate не может отделить отдельный объект от переходного. –

+0

@JBNizet Я не использовал никаких аннотаций как '@ GeneratedValue' или' @ Version'. Бобы заполняются вручную. –

+0

В этом случае, как я уже сказал, Hibernate не может отличить отсоединенную, уже постоянную сущность с идентификатором 56 от временного объекта, который вы хотите вставить с идентификатором 56. Поскольку вы вызываете persist(), он предполагает, что он временный и пытается чтобы вставить его. –

ответ

0

Посмотрите на упорствовать метод спецификации ниже:

/** 
* Make an entity instance managed and persistent. 
* @param entity 
* @throws EntityExistsException if the entity already exists. 
* (The EntityExistsException may be thrown when the persist 
* operation is invoked, or the EntityExistsException or 
* another PersistenceException may be thrown at flush or commit 
* time.) 
* @throws IllegalStateException if this EntityManager has been closed. 
* @throws IllegalArgumentException if not an entity 
* @throws TransactionRequiredException if invoked on a 
* container-managed entity manager of type 
* PersistenceContextType.TRANSACTION and there is 
* no transaction. 
*/ 
public void persist(Object entity); 

Метод должен бросить только IllegalStateException если EntityManager закрыт. Поскольку ваш идентификатор атрибута имеет значение, а объект находится за пределами области сохранения, JPA будет пытаться его сохранить, обрабатывая Entity как новый Entity.

Смежные вопросы