JPA一对多延迟加载(orders和orderdetails), 对于一次查询大量数据和多线程并发非常有帮助。
1. 一对多一般默认就是延迟加载, 在用到具体属性的时候才会执行SQL去抓取数据。
entity.getItems(); //不执行sql
entity.getItems().getProperty(); // 具体使用的才会执行sql
1.1 多对一默认是关闭懒加载的, 需要注解显示开启懒加载
2. 属性级延迟加载注解(就算是blob等大字段JPA好像也不支持, 可以单独设置为一个实体, 然后做OneToOne懒加载)
@Basic(fetch = FetchType.Lazy)
package cn.itcast.bean;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
@Entity
@Table(name="orders") //把表名改成orders(默认表名是order),防止默认表名order与数据库的关键字"order by"中的order冲突。不改的话测试不成功,出现异常,orderitem表建立成功,order表建不了。
public class Order {
private String orderId;
private Float amount = 0f;
private List<OrderDetail> orderDetails= new ArrayList<OrderDetail>();
@Id //要注意:目前JPA规范并没有提供UUID这种生成策略,目前主键值只提供了整型的生成方式,所以@GeneratedValue这个注解就不能在这里用上,不能对字符串进行id自增长。