JPA定义实体之间的关系有如下几种: @OneToOne @ManyToOne @OneToMany @ManyToMany 在定义它们的时候可以通过fetch属性指定加载方式,有两个值: FetchType.LAZY:延迟加载 FetchType.EAGER:急加载 急加载就好理解了,在加载一个实体的时候,其中定义是急加载的的属性(property)和字段(field)会立即从数据库中加载 开发过程中遇到问题最多的就是延迟加载,并且问题都是一个: “为什么我定义为延迟加载了,但没起作用,相关的属性或者字段还是会立即加载出来?” 对于这个问题,我的理解是这样的,我们首先假设有如下的影射关系: @Entity @Table(name = "orders") class Order{
@OneToMany(cascade = {CascadeType.MERGE,CascadeType.PERSIST,CascadeType.REFRESH},fetch = FetchType.LAZY,mappedBy = "order") private Collection lineItems = new HashSet ();
@OneToOne(cascade={CascadeType.REMOVE},fetch=FetchType.LAZY,mappedBy="order") @JoinColumn(name="order_id") private OrderPrice salePrice;
@OneToOne(cascade={CascadeType.REMOVE},fetch=FetchType.LAZY) @JoinColumn(name="customer_id") private Customer customer; }
@Entity @Table(name = "order_items") class LineItem{
@ManyToOne(cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH},fetch = FetchType.LAZY) @JoinColumn(name = "order_id",referencedColumnName = "order_id") private Order order;
}
@Entity @Table(name = "order_finance") @AttributeOverride(name="id",column=@Column(name="order_id")) class OrderPrice extends Price{
private Order order;
@OneToOne(cascade={},fetch=FetchType.LAZY) @JoinColumn(name="order_id",referencedColumnName="order_id") public Order getOrder() { return order; }
public void setOrder(Order order) { this.order = order; }
}
@MappedSupperclass @Table(name = "order_finance") class Price{ @Id public Integer getId(){ ... } } 表的关系是:orders表是一个单独的表,order_items表有一个外键(order_id)引用到orders 表,order_finance有一个外键(order_id)引用到orders表. order_items——->orders