2015-05-16 6 views
0

java.lang.IllegalStateException: org.hibernate.TransientPropertyValueException: объект ссылается на несохраненный переходный экземпляре - сохранить переходный экземпляр перед промывкой: entity.Customer.passport -> entity.Passportjava.lang.IllegalStateException: Сделка не активен

Получаем эту ошибку при попытке продолжить использование hybernate. Ниже мой Клиент Entity Calss

package entity; 

import javax.persistence.CascadeType; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.JoinColumn; 
import javax.persistence.OneToOne; 

@Entity 
public class Customer { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 
    private String name; 

    @OneToOne(cascade = { CascadeType.MERGE }) 
    @JoinColumn(name = "passport_id", unique = true) 
    private Passport passport; 

    public Customer() { 
    } 

    public Customer(String name, Passport passport) { 
     this.setName(name); 
     this.passport = passport; 
    } 

    public Passport getPassport() { 
     return passport; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
} 

Ниже мой основной метод, где я создаю мой EntityManager фабричные питания.

package client; 

    import javax.persistence.EntityManager; 
    import javax.persistence.EntityManagerFactory; 
    import javax.persistence.EntityTransaction; 
    import javax.persistence.Persistence; 

    import entity.Customer; 
    import entity.Passport; 

    public class OneToOneClient { 

     public static void main(String[] args) { 
      EntityManagerFactory emf = Persistence 
        .createEntityManagerFactory("jpa-training"); 
      EntityManager em = emf.createEntityManager(); 
      EntityTransaction txn = em.getTransaction(); 
      try { 
       em.getTransaction().begin(); 
       //txn.begin(); 

       Passport passport = new Passport("99627317"); 
       Customer customer = new Customer("Customer1", passport); 
       em.persist(customer); 

       em.getTransaction().commit(); 
       //txn.commit(); 
      } catch (Exception e) { 
       if (txn != null) { 
        txn.rollback(); 
       } 
       e.printStackTrace(); 
      } finally { 
       if (em != null) { 
        em.close(); 
       } 
      } 
     } 

    } 

Примечание: если я использую CascadeType.PERSIST в моем классе сущности я могу иметь возможность вставить другую строку в БД.

ответ

2

Сохраните passport перед клиентом, и вы в порядке. Альтернатива, как вы упомянули, использует Cascade.PERSIST.

Hibernate не поддерживает другие объекты, не сказав об этом.

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