Hibernate:CasecadeType.ALL 与 {CascadeType.PERSIST、CascadeType.MERGE、CascadeType.DETACH、CascadeType.REFRESH、CascadeType.REMOVE}

Akh*_*ati 4 java hibernate

我有一个简单的休眠 OneToOne 程序。它由Instructor类和InstructorDetail类组成。OneToOne 映射是从 Instructor 到 InstructorDetail 定义的。我只是保存 Instructor 类的一个对象(由于级联,它也应该保存 InstructorDetail 对象)。场景是:

  1. 当我使用 CascadeType.ALL 时,它工作正常。

  2. 但是,当我使用具有所有可能的级联类型的数组(@OneToOne(cascade= {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.DETACH, CascadeType.REFRESH, CascadeType.REMOVE}) )时,它给出以下错误信息:

对象引用未保存的瞬态实例 - 在刷新之前保存瞬态实例:com.poc.entity.InstructorDetail

请在下面找到我的代码:

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

@Entity
@Table(name="instructor")
public class Instructor {

@Id
@GeneratedValue(strategy= GenerationType.AUTO)
@Column(name="id")
private int id;

@Column(name="first_name")
private String firstName;

@Column(name="last_name")
private String lastName;

@OneToOne(cascade= {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.DETACH, CascadeType.REFRESH, CascadeType.REMOVE})
@JoinColumn(name="instructor_detail_id")
private InstructorDetail instructorDetail;

public Instructor() {

}

public Instructor(String firstName, String lastName) {
    super();
    this.firstName = firstName;
    this.lastName = lastName;
}

public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public String getFirstName() {
    return firstName;
}

public void setFirstName(String firstName) {
    this.firstName = firstName;
}

public String getLastName() {
    return lastName;
}

public void setLastName(String lastName) {
    this.lastName = lastName;
}

public InstructorDetail getInstructorDetail() {
    return instructorDetail;
}

public void setInstructorDetail(InstructorDetail instructorDetail) {
    this.instructorDetail = instructorDetail;
}
Run Code Online (Sandbox Code Playgroud)

}

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="instructor_detail")
public class InstructorDetail {

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="id")
private int id;

@Column(name="youtube_channel", length=40)
private String youtubeChannel;

@Column(name="hobby", length=20)
private String hobby;

public InstructorDetail() {

}

public InstructorDetail(String youtubeChannel, String hobby) {
    super();
    this.youtubeChannel = youtubeChannel;
    this.hobby = hobby;
}

public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public String getYoutubeChannel() {
    return youtubeChannel;
}

public void setYoutubeChannel(String youtubeChannel) {
    this.youtubeChannel = youtubeChannel;
}

public String getHobby() {
    return hobby;
}

public void setHobby(String hobby) {
    this.hobby = hobby;
}




}
Run Code Online (Sandbox Code Playgroud)

..

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

import com.poc.entity.Instructor;
import com.poc.entity.InstructorDetail;

public class OneToOneDemo {

private static SessionFactory sessionFactory;

static {
    sessionFactory = new Configuration().configure("hibernate.cfg.xml")
                            .addAnnotatedClass(Instructor.class)
                            .addAnnotatedClass(InstructorDetail.class)
                            .buildSessionFactory();
}

public static void main(String...s) {

    InstructorDetail instructorDetail = new InstructorDetail("xyz/youtube.com","cooking");

    Instructor instructor = new Instructor("Bhupesh","Nimje");

    try {
        instructor.setInstructorDetail(instructorDetail);

        save(instructor);
    }
    finally {
        sessionFactory.close();
    }


}

public static void save(Instructor instructor) {
    Session session = null;
    try {
        session = sessionFactory.openSession();

        session.beginTransaction();

        session.save(instructor);

        session.getTransaction().commit();
    }
    catch(Exception e) {
        e.printStackTrace();
    }
    finally {
        session.close();
    }
}
Run Code Online (Sandbox Code Playgroud)

}

Akh*_*ati 5

终于我能够破解它了。我们使用的 CascadeType 枚举是 javax.persistence 包的。session.save()另一方面,该方法是原始的 Hibernate 方法,不符合 JPA 规范,因此存在这种不一致。但是,如果我们使用 session.persist() 方法做同样的事情,它将像魅力一样工作。