文章目录
1 单向一对多
单向一对多用得比较少(性能差
),但是依然要求必须掌握,因为我们在使用双向一对多还会用到单向一对多的相应配置
1.1 映射关系
//产品分类
@Entity
@Table(name = "t_productdir")
public class ProductDir {
@Id
@GeneratedValue
private Long id;
private String name;
//配置onetomany --- 配置集合
@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name = "dir_id") //设置外键
private Set<Product> products = new HashSet<>();
get/set方法
}
我们一般不使用单向一对多(原因:性能太差)
3条insert,2条update,无论怎样调整保存的顺序,都会有额外的update语句
原因就是现在外键是由一方来处理,一方处理必须发出额外的update语句
1.2 延迟加载
我们修改成FetchType.EAGER
后,不管有没有找类型项目的商品,它都会马上发送SQL来去查询数据
在配置映射关系的时候如果是@ManyToOne(fetch=FetchType.LAZY)
,@OneToMany(fetch=FetchType.LAZY)
,@ManyToMany(fetch=FetchType.LAZY)
都是默认使用延迟加载提高性能的。
只有Many在后面都是使用延迟加载获取数据
1.3 判断集合是否有值
要通过一方集合属性的size是否为0判断集合是否有值,不能通过集合是否为null来配置,这个和单向多对一是不同的
2 集合映射
声明集合的时候必须使用接口
2.1 集合映射的JAVA类型
常用的有2种:
java.util.Set
对应PersistentSet
java.util.List
对应PersistentBag
Set:不能重复,集合里面的元素没有顺序
List:可以重复,集合里面的元素有顺序
2.2 怎么选择集合映射?
看数据是否会重复,是否需要顺序
set
一般用于多对多,也有一对多
list
一般只是用在组合关系
2.3 set映射
特点:无序,不可以重复
//配置onetomany --- 配置集合
@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name = "dir_id") //设置外键
private Set<Product> products = new HashSet<>();
2.4 list映射
特点:有序,可以重复,一般用在组合关系
@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name = "dir_id")
private List<ProductSet> products = new ArrayList<ProductSet>();
2.5 小结
- 配置集合的时候必须配置接口
- 一般都是使用Set接口,只有组合关系使用List接口
- 使用List接口的时候可以配置
@Order
进行排序