Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 单向多通:为什么瞬态实例使用CascadeType.ALL而不是CascadeType.PERSIST保存_Hibernate_Jpa_Jpa 2.0_Cascade_Hibernate Cascade - Fatal编程技术网

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;
    }   
}