@ManyToOne( cascade=CascadeType.ALL,fetch = FetchType.EAGER)
@JoinColumn(name = "orderId" )
private OrderDetail orderDetail;
注意:慎用All 因为会级联删除 一般情况下设为MERGE 即可
cascade的作用 给当前设置的实体操作另一个实体的权限
package javax.persistence;
/**
* Defines the set of cascadable operations that are propagated
* to the associated entity.
* The value <code>cascade=ALL</code> is equivalent to
* <code>cascade={PERSIST, MERGE, REMOVE, REFRESH, DETACH}</code>.
*
* @since Java Persistence 1.0
*/
public enum CascadeType {
/** Cascade all operations */
ALL,
/** Cascade persist operation */
PERSIST,
/** Cascade merge operation */
MERGE,
/** Cascade remove operation */
REMOVE,
/** Cascade refresh operation */
REFRESH,
/**
* Cascade detach operation
*
* @since Java Persistence 2.0
*
*/
DETACH
}
- CascadeType.REMOVE
Cascade remove operation,级联删除操作。
删除当前实体时,与它有映射关系的实体也会跟着被删除。- CascadeType.MERGE
Cascade merge operation,级联更新(合并)操作。
当orderDetail中的数据改变,会相应地更新order中的数据。- CascadeType.DETACH
Cascade detach operation,级联脱管/游离操作。
如果你要删除一个实体,但是它有外键无法删除,你就需要这个级联权限了。它会撤销所有相关的外键关联。- CascadeType.REFRESH
Cascade refresh operation,级联刷新操作。
假设场景 有一个订单,订单里面关联了许多商品,这个订单可以被很多人操作,那么这个时候A对此订单和关联的商品进行了修改,与此同时,B也进行了相同的操作,但是B先一步比A保存了数据,那么当A保存数据的时候,就需要先刷新订单信息及关联的商品信息后,再将订单及商品保存- CascadeType.ALL
Cascade all operations,清晰明确,拥有以上所有级联操作权限。
注意:jpa操作非持久化数据异常: (级联保存类似)
TransientPropertyValueException:对象引用未保存的瞬态实例 - 在刷新之前保存瞬态实例
A关联B,在保存A对象时如果A对象关联的B对象在数据库中已经存在,可以直接保存A,如果不存在,仅仅是没持久化的对象,那么应该先保存B对象,然后再保存A对象。
FetchType
FetchType.LAZY:懒加载,加载一个实体时,定义懒加载的属性不会马上从数据库中加载
FetchType.EAGER:急加载,加载一个实体时,定义急加载的属性会立即从数据库中加载
FetchType fetch() default EAGER;
public enum FetchType {
/** Defines that data can be lazily fetched. */
LAZY,
/** Defines that data must be eagerly fetched. */
EAGER
}
注意: CascadeType[] cascade() default {}; 默认是一个数组
@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface OneToOne {
Class targetEntity() default void.class;
CascadeType[] cascade() default {};
FetchType fetch() default FetchType.EAGER;
boolean optional() default true;
String mappedBy() default "";
boolean orphanRemoval() default false;
}
所以可以这样写:
@OneToOne(cascade={CascadeType.MERGE, CascadeType.REMOVE, CascadeType.PERSIST}, fetch=FetchType.EAGER)
private Person person;