JPA的多表映射
一对多关系映射(默认一方放弃外键维护,默认延迟加载):
@OneToMany:作用:建立一对多的关系映射
属性:targetEntityClass:指定多的多方的类的字节码。
mappedBy:指定从表实体类中引用主表的对象的名称。
cascade:指定要使用的级联操作
fetch:指定是否采用延迟加载
orphanRemoval:是否使用孤儿删除
@ManyToOne:作用:建立多对一关系
属性:targetEntityClass:指定一的一方实体类字节码
cascode:指定要使用的级联操作
fetch:指定是否采用延迟加载
optional:关联是否可选。如果设置为false,则必须始终存在非空关系。
@JoinColumn:作用:用于定义主键字段和外键字段的对应关系。
属性:name:指定外键字段的名称
referenceColumnName:指定引用主表的主键字段民称
unique:是否唯一,默认不唯一
nullable:是否允许为空,默认值允许
insertable:是否允许插入,默认值允许
updatable:是否允许更新,默认值允许
columnDefinition:列的定义信息
一对多举例(客户和联系人为例):
客户实体类(主表,一方的表):
@Entity
//设置表名为
@Table(name="customer")
public class Customer implements Serializable {
//配置ID
@Id
//表中的主键
@Column(name="cid")
//配置主键生成策略
@GenericGenerator(name="ontomany",strategy="native")
@GeneratedValue(generator="ontomany")
private Integer cid;
@Column(name="cname")
private String cname;
@Column(name="csex")
private String csex;
//targetEntity指定多的一方的类的字节码对象,mappedBy指定从表实体类中引用主表的对象的名称
//注意:多对多中不能配All,可能会删除全部信息
@OneToMany(targetEntity=LinkMan.class,mappedBy="customer",cascade=CascadeType.ALL)
private Set<LinkMan> linkmans = new HashSet<LinkMan>();
//下面的set/get方法就不写了
联系人实体类(从表,多方的表):
//声明为实体
@Entity
//建立表的名称
@Table(name="linkman")
public class LinkMan implements Serializable{
//配置ID
@Id
//配置表中的主键的值
@Column(name="lid")
//配置主键生成策略
@GenericGenerator(name="manytoone",strategy="native")
@GeneratedValue(generator="manytoone")
private Integer lid;
@Column(name="lname")
private String lname;
@Column(name="lsex")
private String lsex;
@ManyToOne(targetEntity=Customer.class)
@JoinColumn(name="cid",referencedColumnName="cid")
private Customer customer;
多对多关系的映射(不操作的一方放弃外键维护,默认延迟加载):
@ManyToMany:作用:用于映射多对多的关系
属性:cascode:配置级联操作。
fetch:配置是否采用延迟加载
targetEntity:配置目标的实体类,映射多对多的时候不用写
mappedBy:指定另一个多方实体类中引用该表的对象的名称。
@JoinTable:作用:针对中间表的配置
属性:name:配置中间表的名称
joinColumns:中间表的外键字段关联当前实体类所对应表的主键字段
inverseJoinColumn:中间表的外键字段关联对方表的主键字段
@JoinColumn:作用:用于定于主键字段和外键字段的对应关系。
属性:name:指定外键字段的名称。
referencedColumnName:指定引用主表的主键字段的名称
unique:是否唯一,默认值不唯一
nullable:是否允许为空,默认值允许
inserttable:是否允许插入,默认值允许
updatable:是否允许更新,默认允许
columnDefinition:列的定义信息
多对多举例(用户和角色为例):
用户实体类:
//配置Entity指定实体
@Entity
@Table(name="user")
public class User implements Serializable{
//配置主键生成策略
@Id
@Column(name="uid")
@GenericGenerator(name="umanytomany",strategy="native")
@GeneratedValue(generator="umanytomany")
private Integer uid;
@Column(name="uname")
private String uname;
@Column(name="usex")
private String usex;
@ManyToMany(targetEntity=Role.class,cascade={CascadeType.PERSIST,CascadeType.MERGE})
//name中间表的名称,joinColumns和用户做主外键关联,inverseJoinColumns和角色做主外键关联
@JoinTable(name="user_role",joinColumns={@JoinColumn(name="uid",referencedColumnName="uid")},inverseJoinColumns={@JoinColumn(name="rid",referencedColumnName="rid")})
private Set<Role> roles = new HashSet<Role>();
角色实体类:
@Entity
@Table(name="role")
public class Role implements Serializable{
@Id
@Column(name="rid")
@GenericGenerator(name="rmanytomany",strategy="native")
@GeneratedValue(generator="rmanytomany")
private Integer rid;
@Column(name="rname")
private String rname;
@Column(name="rsex")
private String rsex;
//放弃外键的维护mappedBy="roles",让直接找User类中的roles去设置外键
@ManyToMany(targetEntity=User.class,mappedBy="roles")
private Set<User> users = new HashSet<User>();
原文:https://blog.csdn.net/shuaishuaidewo/article/details/78439525