首先分析实体间关联关系
1:@OneToOne
2:@OneToMany @ManyToOne
3:@ManyToMany
实体之间进行关联的时候 只能One端操作Many端 代码层面则是cascade = CascadeType.All 只能写在One端
One端删除,修改可以影响到Many端。反过来不行。
一、@OneToOne关系映射
一个人有一个地址,就是一对一关系。其中people表的地址id对应地址表的id
1.1 通过外键关联一对一关系
people(id,name,addressId)
address(id,phone,city,address)
People.java
@Entity
public class People{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = “id”, nullable = false)
private Long id;
@Column(name = "name", nullable = true, length = 20)
private String name;
//People是关系的维护端,当删除 people,会级联删除 address。默认不联级。
@OneToOne(cascade=CascadeType.ALL)
//加入表中的字段(name)addressId,参考对应Address的id(referencedColumnName )
@JoinColumn(name = "addressId", referencedColumnName = "id")
private Address address;
}
Address.java
@Entity
public class Address {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false)
private Long id;
@Column(name = "phone", nullable = true, length = 11)
private String phone;
@Column(name = "city", nullable = true, length = 6)
private String city;
@Column(name = "address", nullable = true, length = 100)
private String address;
}
1.2 通过关联表保持
People(id,name)
Address(id,address)
PeopleAddr(PeopleId,addrId)关联表
People.java
@Entity
public class People {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false)
private Long id;
@Column(name = "name", nullable = true, length = 20)
private String name;
@OneToOne(cascade=CascadeType.ALL)//People是关系的维护端
@JoinTable(name = "PeopleAddr",//关系表名
joinColumns = @JoinColumn(name="PeopleId"),//对应当前主键的
inverseJoinColumns = @JoinColumn(name = "addressId"))//对应关联表的id的字段
private Address address;//关联表-地址实体
}
二、@OneToMany 和 @ManyToOne
一个班级有很多同学(一对多),班级被删除班上的同学的数据也没了(联级删除,默认没有)。删除同学的数据不会影响到班级(many不能影响one)
myClass.java
@Entity
public class Author {
@Id // 主键
@GeneratedValue(strategy = GenerationType.IDENTITY) // 自增长策略
private Long id; //id
@NotEmpty(message = "姓名不能为空")
@Column(nullable = false, length = 20)
private String name;
//指定Article的author字段关联id,mappedBy还代表放弃维护关系。即当自身修改删除时不会触发关联对象的相应操作。对应的,由对方维护。即文章修改了,作者对象下的文章列表也会相应修改。
//fetch=FetchType.LAZY 懒加载,不会马上加载。对于马上要用的可以设置马上加载
//mappendBy和JoinColumn相比一个放弃维护,另一个是建立联系(一端放弃,另一端建立)
@OneToMany(mappedBy = "author",cascade=CascadeType.ALL,fetch=FetchType.LAZY)
private List<Article> articleList;//文章列表
}
Article.java
@Entity
public class Article {
@ManyToOne(cascade={CascadeType.MERGE,CascadeType.REFRESH},optional=false)//可选属性optional=false,表示author不能为空。删除文章,不影响用户
@JoinColumn(name="author_id")//设置在article表中的关联字段(外键)
private Author author;//所属作者
}
三、@ManyToMany
由其中一端维护关系
被维护的一端无法直接删除,需要解除关系后才能删除。或者直接删除维护的一端,关系自动解除。
User.getAuthority().remove(authority)解除关系
User.setAuthorities(authorities)绑定关系
多对多一般不设置联级操作
用户和权限组的例子就是多对多
User.java
@ManyToMany
@JoinTable(name = "user_authority",joinColumns = @JoinColumn(name = "user_id"),
inverseJoinColumns = @JoinColumn(name = "authority_id"))
private List<Authority> authorityList;
不使用@JoinTable注解,默认生成的关联表名称为主表表名+下划线+从表表名user_authority
关联到主表的外键名:主表名+下划线+主表中的主键列名user_id
关联到从表的外键名:主表中用于关联的属性名+下划线+从表的主键列名authority_id
主表就是关系维护端对应的表,从表就是关系被维护端对应的表
Authority.java
@ManyToMany(mappedBy = “authorityList”)
private List userList;