shashank redemption
shashank redemption

Reputation: 1

java.lang.IllegalStateException: Transaction not active

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

Answers (1)

mh-dev
mh-dev

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

Related Questions