Reputation: 1
java.lang.IllegalStateException: org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing : entity.Customer.passport -> entity.Passport
Am getting this error when trying persist using hybernate. Below is my Customer 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;
}
}
Below is my main method where am creating my entitymanager factory stuffs.
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();
}
}
}
}
Note: if i use CascadeType.PERSIST in my entity class i can able to insert another row in the db.
Upvotes: 0
Views: 4996
Reputation: 5503
Save the passport
before the customer and you are fine. Alternative as you mentioned use Cascade.PERSIST
.
Hibernate does not persist other entities without getting told to do so.
Upvotes: 2