jpa03

1.单向一对多

单向一对多用得比较少(性能差),但是依然要求必须掌握,因为我们在使用双向一对多还会用到单向一对多的相应配置

多对一即n多1关系。
在从表中与主表有外键关系的列的get方法上添加@ManyToOne注解后,该属性则表示为外键,该外键关系为其属性类型对应的类型。用JoinColumn注解设置外键的列名。

1.1配置

多方

@Entity@Table(name="t_product")
public class Product {   
    @Id    
    @GeneratedValue   
    private Long id;   
    private String name;
}

一方配置

 

@Entity
@Table(name="t_productDir")
public class ProductDir {
    @Id
    @GeneratedValue
    private Long id;
    private  String name;
    //泛型必须添加进去
    @OneToMany
    @JoinColumn(name="dir_id")
    private Set<Product> products = new HashSet<>();
 }

1.2 保存

无论怎么保存,都在额外发送sql ,所有一般不用单向一对多

1.3查询

lazy加载

现在使用 Set集合 HashSet 打印出来 PersistentSet
PersistentSet 它是Set的实现类 和 HashSet一样 ,PersistentSet 和 HashSet都是
Set的实现类,是兄弟关系 --在定义实体的集合的时候,不要定义HashSet
PersistentBag 也是 List的实现类,和ArrayList一样,ArrayList和PersistentBag都是
List的实现 ,是兄弟关系 --在定义实体的集合的时候,不要定义ArrayList

1.4集合的使用

声明的时候必需使用接口

现在在定义集合的时候,什么情况下使用List ,什么情况下使用Set?

List/Set区别?

List是有序 可以重复 Set 无顺序,不能重复

set没有重复,没有顺序,一般用在多对多manytomany,也有一对多 onetomany

list有重复,顺序要求一般只是用在组合关系 --订单 单据

1.5 集合排序 orderby

配置

@OneToMany
@JoinColumn(name = "dir_id")
@OrderBy("price DESC")       
private List<ProductSet> products = new ArrayList<ProductSet>();  = new HashSet<ProductSet>(); 

2 双向的一对多 或者 多对一

1.同时保存你要保存一方与多方相互知道

2.一方放弃关系的维护(MapperBy)

3.级联  级联危险,不要随便用

4.一般组合关系会用到它

 @OneToMany(mappedBy = "dir")
    private List<Product> products = new ArrayList<>();

5.级联操作保存

级联:就是我操作一方数据,就同时可以多方的数据也一并操作

persist(dir);

级联分为:级联保存 级联删除

@OneToMany(cascade = CascadeType.PRESIST)

级联删除

@OneToMany(cascade = CascadeType.REMOVE)

孤儿删除

@OneToMany(cascade = CascadeType.REMOVE,mappedBy = "dir",orphanRemoval = true)

强级联

@OneToMany(cascade = CascadeType.ALL,mappedBy = "dir",orphanRemoval = true)

3 单向多对多

1单向多对多配置

假设有角色(trole)和用户组(tgroup)两个表,是多对多的关系,即一个角色可以多个用户组拥有,一个用户组也可以拥有多个角色。这里需要增加一个角色-组的对应表tgroup_role,用来记录多对多的对应关系。

User

@Entity
@Table(name="t_user")
public class User {
    @Id
    @GeneratedValue
    private Long id;
    private String name;
    @ManyToMany
    @JoinTable(name="t_user_role",joinColumns={@JoinColumn(name="user_id")},
            inverseJoinColumns ={@JoinColumn(name="role_id")} )
    private Set<Role> roles = new HashSet<>();
}

Role

@Entity
@Table(name="t_role")
public class Role {   
    @Id    
    @GeneratedValue    
    private Long id;    
    private String name;
}

2.双向多对多

role

@ManyToMany(fetch = FetchType.LAZY,cascade = CascadeType.REMOVE)
    @JoinTable(name="t_user_role",joinColumns={@JoinColumn(name="role_id")},
            inverseJoinColumns ={@JoinColumn(name="user_id")} )
    private Set<User> users = new HashSet<>();

user

@ManyToMany(fetch = FetchType.LAZY,cascade = CascadeType.REMOVE)
    @JoinTable(name="t_user_role",joinColumns={@JoinColumn(name="user_id")},
            inverseJoinColumns ={@JoinColumn(name="role_id")} )
    private Set<Role> roles = new HashSet<>();

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值