簡體   English   中英

如何解決對象引用未保存的瞬態實例的錯誤-在刷新之前保存瞬態實例?

[英]How do I solve this error of object references an unsaved transient instance - save the transient instance before flushing?

這是我的Employee類:

@Entity
public class Employee {
@Id
@GeneratedValue
private int id;
private String firstName;
private String lastName;
private int salary;
@OneToMany(targetEntity = Certificate.class)
private Set<?> certificate;
public Employee() {}
public Employee(String fname, String lname, int salary, Set<?> certificate) {
    this.firstName = fname;
    this.lastName = lname;
    this.salary = salary;
    this.certificate = certificate;
}
public Employee(Employee e1) {}
public int getId() {
    return id;
}
public void setId(int id) {
    this.id = id;
}
public String getFirstName() {
    return firstName;
}
public void setFirstName(String first_name) {
    this.firstName = first_name;
}
public String getLastName() {
    return lastName;
}
public void setLastName(String last_name) {
    this.lastName = last_name;
}
public int getSalary() {
    return salary;
}
public void setSalary(int salary) {
    this.salary = salary;
}
public Set<?> getCertificate() {
    return certificate;
}
public void setCertificate(Set<?> certificate) {
    this.certificate = certificate;
}
}

這是我的證書課

@Entity
public class Certificate {
@Id
@GeneratedValue
private int id;
private String name;
public Certificate() {}
public Certificate(String name) {
    this.name = name;
}
public void setId(int id) {
    this.id = id;
}
public int getId() {
    return id;
}
public void setName(String name) {
    this.name = name;
}
public String getName() {
    return name;
}
public boolean equals(Object obj) {
    if (obj == null) {
        return false;
    }
    if (!this.getClass().equals(obj.getClass())) {
        return false;
    }
    Certificate obj2 = (Certificate) obj;
    if ((this.id == obj2.getId()) && (this.name.equals(obj2.getName()))) {
        return true;
    }
    return false;
}
public int hashCode() {
    int tmp = 0;
    tmp = (id + name).hashCode();
    return tmp;
}
}

這是我的ManageEmployee類

public class ManageEmployee {

public static void main(String[] args) {
    Employee e1 = new Employee();
    Employee e2 = new Employee();

    e1.setFirstName("deepak");
    e1.setLastName("SP");
    e1.setSalary(1000);
    Set<Certificate> set1 = new HashSet<Certificate>();
    set1.add(new Certificate("BE"));
    set1.add(new Certificate("MS"));
    e1.setCertificate(set1);

    e2.setFirstName("deepaksp");
    e2.setLastName("SP");
    e2.setSalary(10010);
    Set<Certificate> set2 = new HashSet<Certificate>();
    set2.add(new Certificate("BE"));
    set2.add(new Certificate("MS"));
    e2.setCertificate(set2);

    SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory(
            new StandardServiceRegistryBuilder().applySettings(new Configuration().configure().getProperties())
                    .build());
    System.out.println("Session Factory built");
    Session session = sessionFactory.openSession();
    System.out.println("Session opened");
    session.beginTransaction();
    System.out.println("Transaction has begun");
    session.save(e1);
    session.save(e2);
    System.out.println("Object has been saved");
    session.getTransaction().commit();
    System.out.println("transaction has been commited");
}
}

我得到這個錯誤

線程“主”中的異常org.hibernate.TransientObjectException:對象引用了一個未保存的瞬態實例-在刷新之前保存該瞬態實例:org.hibernate.tutorials.hibernatetutorials.Certificate at org.hibernate.engine.internal.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys。 org.hibernate.type.EntityType.getIdentifier(EntityType.java:537)處的org.hibernate.type.ManyToOneType.nullSafeSet(ManyToOneType.java:165)處的org.hibernate.persister.collection.AbstractCollectionPersister.writeElement上的java:294) (AbstractCollectionPersister.java:899)在org.hibernate.persister.collection.AbstractCollectionPersister.recreate(AbstractCollectionPersister.java:1308)在org.hibernate.action.internal.CollectionRecreateAction.execute(CollectionRecreateAction.java:67)在org.hibernate。 org.hibernate上的engine.spi.ActionQueue.executeActions(ActionQueue.java:465)org.hibernate.event.internal.AbstractFlushingEventListen上的engine.spi.ActionQueue.executeActions(ActionQueue.java:351) org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:56)的er.performExecutions(AbstractFlushingEventListener.java:350)org.hibernate的org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1258) org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101)的.internal.SessionImpl.managedFlush(SessionImpl.java:425)在org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit (AbstractTransactionImpl.java:177)在org.hibernate.tutorials.hibernatetutorials.ManageEmployee.main(ManageEmployee.java:44)

試試下面的代碼。

@OneToMany(targetEntity = Certificate.class, cascade=CascadeType.ALL)
private Set<?> certificate;

您需要指定級聯類型以在保留父對象的同時保留子對象。

  • 級聯

級聯(可選):指定應將哪些操作從父對象級聯到關聯的(子)對象。

Allowed values: cascade={ALL, PERSIST, MERGE, REMOVE, REFRESH, DETACH}.

請參考oracle文檔以獲取有關允許的值類型的更多詳細信息。 https://docs.oracle.com/javaee/6/api/javax/persistence/CascadeType.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM