Hibernate 单向多通:为什么瞬态实例使用CascadeType.ALL而不是CascadeType.PERSIST保存
当我尝试运行以下代码时,我得到Hibernate 单向多通:为什么瞬态实例使用CascadeType.ALL而不是CascadeType.PERSIST保存,hibernate,jpa,jpa-2.0,cascade,hibernate-cascade,Hibernate,Jpa,Jpa 2.0,Cascade,Hibernate Cascade,当我尝试运行以下代码时,我得到org.hibernate.transientObject异常:对象引用未保存的临时实例-在刷新之前保存临时实例:safu.Publisher异常: public class SafuClient { public static void main(String[] args) { Session session = HibernateUtil.getSessionFactory().openSession(); sessi
org.hibernate.transientObject异常:对象引用未保存的临时实例-在刷新之前保存临时实例:safu.Publisher
异常:
public class SafuClient {
public static void main(String[] args) {
Session session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
Publisher publisher = new Publisher("ABC", "ABC Co.");
Book book = new Book("1-932394-88-5", "Safu", publisher);
session.save(book);
session.getTransaction().commit();
}
}
从一本书到一家出版社,我有一种多对一的关系。图书和出版商实体如下:
如果我将
@ManyToOne(cascade={CascadeType.PERSIST})
替换为@ManyToOne(cascade={CascadeType.ALL})
在书
实体中,一切正常
有人能解释一下为什么会这样吗?试试session.persist(书)
这解决了问题,而不是session.save(book)
session.save(book)方法的工作原理是从book
实体的@ManyToOne
注释中删除cascade属性(cascade={CascadeType.PERSIST}
),然后在publisher字段中添加@cascade(value=CascadeType.save\u UPDATE)
@Cascade(value=CascadeType.SAVE\u UPDATE)
使用Hibernate的本机注释
按照更新后的Book.java进行操作:
我以前也遇到过这个错误,但没有找到解决办法。
@Entity
public class Book {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
private String isbn;
private String name;
@ManyToOne(cascade={CascadeType.PERSIST})
@JoinColumn(name="publisher_id")
private Publisher publisher;
public Book() {}
public Book(String isbn, String name, Publisher publisher) {
this.isbn = isbn;
this.name = name;
this.publisher = publisher;
}
}
@Entity
public class Publisher {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
private String code;
private String name;
public Publisher() {}
public Publisher(String code, String name) {
this.code = code;
this.name = name;
}
}
@Entity
public class Book {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
private String isbn;
private String name;
@ManyToOne
@JoinColumn(name="publisher_id")
@Cascade(value=CascadeType.SAVE_UPDATE)
private Publisher publisher;
public Book() {}
public Book(String isbn, String name) {
this.isbn = isbn;
this.name = name;
}
public Book(String isbn, String name, Publisher publisher) {
this.isbn = isbn;
this.name = name;
this.publisher = publisher;
}
}