天天看点

JPA使用笔记

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