1.单向一对多
单向一对多用得比较少(性能差),但是依然要求必须掌握,因为我们在使用双向一对多还会用到单向一对多的相应配置。
映射关系
@Entity
public class Product {
@Id
@GeneratedValue
private Long id;
private String name;
@Entity
public class ProductDir {
@Id
@GeneratedValue
private Long id;
private String name;
@OneToMany
// 必须配置外键id,否则会多生成一张表,形成多对多的关系
@JoinColumn(name = "dir_id")
// 建议实例化,用的时候不需要在实例化,这里和单向多对一要求不同
private Set<Product> products = new HashSet<Product>();
保存代码
// 一次性保存一方,同时保存2个多方
@Test
public void persist() throws Exception {
// 一方
ProductDir dir = new ProductDir();
dir.setName("类型1");
// 多方
Product product = new Product();
product.setName("产品1");
Product product2 = new Product();
product2.setName("产品2");
// 连接关系(只能由一方建立到多方的关系)
dir.getProducts().add(product);
dir.getProducts().add(product2);
EntityManager entityManager = JPAUtils.getEntityManager();
entityManager.getTransaction().begin();
// 保存一方(产品)
entityManager.persist(dir);
// 保存多方(产品类型)
entityManager.persist(product2);
entityManager.persist(product);
entityManager.getTransaction().commit();
entityManager.close();
}
总结: 不管怎么样保存,都会至少发送5条sql语句,所以性能差,而使用单向多对一可以减少到3条,所以一般不适用
获取数据
@Test
public void get() throws Exception {
EntityManager entityManager = JPAUtils.getEntityManager();
// 拿到一方(产品类别)的数据
ProductDir dir = entityManager.find(ProductDir.class, 1L);
// 打印产品类别
System.out.println(dir);
// 打印产品类别
System.out.println(dir.getProducts());
// 判断该产品类别中是否有产品
if (dir.getProducts().size() == 0) {
System.out.println("当前产品没有类型");
} else {
System.out.println("当前产品有类型");
}
entityManager.close();
}
延迟加载
当我们去拿集合部分的时候,Hiberante也使用了延时加载来提交程序的性能。
修改@OneToMany(fetch=FetchType.EAGER) 迫切加载
总结:这个fetch的值默认为FetchType.LAZY,则实现延时加载,
而我们修改成FetchType.EAGER后,不管有没有找类型项目的商品,它都会马上发送SQL来去查询数据。
但是这种做法严重影响性能。–关联(join)查询影响性能
在配置映射关系的时候如果是@ManyToOne(fetch=FetchType.LAZY),@OneToMany(fetch=FetchType.LAZY) ,@ManyToMany(fetch=FetchType.LAZY) 都是默认使用延迟加载提高性能的。
只要Many在后面都是使用延迟加载获取数据。
2. 集合映射
hibernate提供的集合延迟加载类
org.hibernate.collection.internal.PersistentSet 实现了java.util.Set接口
org.hibernate.collection.internal.PersistentBag 实现了java.util.List接口
java.util.Set对应PersistentSet
java.util.List对应PersistentBag
Set:不能重复,集合里面的元素没有顺序
List:可以重复,集合里面的元