jpa中映射关系

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:可以重复,集合里面的元

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值