如果Cascade类型不是All,session.save()将不起作用?

时间:2019-01-05 13:55:00

标签: hibernate

public class Instructor{
    @OnetoOne(cascade=CascadeType.Persist)
    @JoinColumn(name="instructor_detail")
    public InstructorDetail detail;
}

strategy是strategy = GenerationType.IDENTITY,两个数据库都是mysql 当我为这两个类创建2个瞬态实体并在Instructor中设置InstructorDetail并使用session.save(instructor)时。

我收到错误消息“对象引用了一个未保存的瞬态实例-在刷新之前保存该瞬态实例:”,但是当我使用session.persist(instructor)时,两个实体都保存到db了吗?

保存和保留到CascadeType的区别是什么?

1 个答案:

答案 0 :(得分:0)

您可以在Hibernate Session的Java API文档中找到该信息:

/**
 * Make a transient instance persistent. This operation cascades to associated
 * instances if the association is mapped with {@code cascade="persist"}
 * <p/>
 * The semantics of this method are defined by JSR-220.
 *
 * @param object a transient instance to be made persistent
 */
void persist(Object object);

所以此方法有效,因为您已定义@OnetoOne(cascade = CascadeType.Persist)

/**
 * Persist the given transient instance, first assigning a generated identifier. (Or
 * using the current value of the identifier property if the <tt>assigned</tt>
 * generator is used.) This operation cascades to associated instances if the
 * association is mapped with {@code cascade="save-update"}
 *
 * @param object a transient instance of a persistent class
 *
 * @return the generated identifier
 */
Serializable save(Object object);

因此,要使其正常工作,必须添加级联保存更新 但是:save-update是特定于Hibernate的,而不是JPA。因此,您不应使用保存。

最好不要使用Hibernate Session,而应使用JPA EntityManager。