1. 程式人生 > >hibernate註解之@Onetomany、@Manytoone、@JoinColumn

hibernate註解之@Onetomany、@Manytoone、@JoinColumn

 

@Onetomany用於實體類與資料庫表對映中少的一方,請看下面的例子。

假設一個使用者只有一種角色,使用者和角色是onetomany的關係

使用者實體

複製程式碼
@Entity
@Table(name="user")
public class UserEntity implements Serializable{
    
    @Id
    @GenericGenerator(name="generator",strategy="uuid")
    @GeneratedValue(generator="generator")
    @Column(name="id")
    private String id;
    @Column(name="userName")
    private String userName;
    @Column(name="password")
    private String password;
    @Temporal(value=TemporalType.TIMESTAMP)
    private Date createDate;
  ......
複製程式碼

角色實體

複製程式碼
@Entity
@Table(name="role")
public class RoleEntity implements Serializable{

    @Id
    @GenericGenerator(name="generator",strategy="uuid")
    @GeneratedValue(generator="generator")
    @Column(name="id")
    private String id;
    @Column(name="name")
    private String name;
    @OneToMany(fetch=FetchType.LAZY,cascade=CascadeType.PERSIST)
    private Set<UserEntity> user;
複製程式碼

同時設定配置檔案為<prop key="hibernate.hbm2ddl.auto">update</prop>

那麼在專案啟動後會自動生成三張表,分別是

角色表

使用者表

角色使用者表

@Onetomany 的引數:

mappedBy:用於雙向關聯時使用,否則會引起資料不一致的問題。

fetch:可取的值有FetchType.EAGER和FetchType.LAZY,前者表示主類被載入時載入,後者表示被訪問時才會載入

cascade:CascadeType.PERSIST(級聯新建)、CascadeType.REMOVE(級聯刪除)、CascadeType.REFRESH(級聯重新整理)、CascadeType.MERGE(級聯更新)、CascadeType.ALL(選擇全部)

@Manytoone

用於多對一,請看下例,

使用者實體類

複製程式碼
@Entity
@Table(name="user")
public class UserEntity implements Serializable{
    @Id
    @GenericGenerator(name="generator",strategy="uuid")
    @GeneratedValue(generator="generator")
    @Column(name="id")
    private String id;
    @Column(name="userName")
    private String userName;
    @Column(name="password")
    private String password;
    @Temporal(value=TemporalType.TIMESTAMP)
    private Date createDate;
    @ManyToOne(cascade=CascadeType.ALL,fetch=FetchType.LAZY,optional=true)
    @JoinColumn(name="roleid",nullable=true)
    private RoleEntity role;
複製程式碼

 

這樣在專案啟動後只有兩種表

role表

 

 user表

@Manytoone的引數:optional 屬性是定義該關聯類對是否必須存在,值為false時,關聯類雙方都必須存在,如果關係被維護端不存在,查詢的結果為null。 值為true 時, 關係被維護端可以不存在,查詢的結果仍然會返回關係維護端,在關係維護端中指向關係被維護端的屬性為null。 optional 屬性的預設值是true。

其它屬性與onetomany相同。

@JoinColumn

與@Column用法相同,區別是@JoinColumn作用的屬性必須是實體類

@Onetomany用於實體類與資料庫表對映中少的一方,請看下面的例子。

假設一個使用者只有一種角色,使用者和角色是onetomany的關係

使用者實體

複製程式碼
@Entity
@Table(name="user")
public class UserEntity implements Serializable{
    
    @Id
    @GenericGenerator(name="generator",strategy="uuid")
    @GeneratedValue(generator="generator")
    @Column(name="id")
    private String id;
    @Column(name="userName")
    private String userName;
    @Column(name="password")
    private String password;
    @Temporal(value=TemporalType.TIMESTAMP)
    private Date createDate;
  ......
複製程式碼

角色實體

複製程式碼
@Entity
@Table(name="role")
public class RoleEntity implements Serializable{

    @Id
    @GenericGenerator(name="generator",strategy="uuid")
    @GeneratedValue(generator="generator")
    @Column(name="id")
    private String id;
    @Column(name="name")
    private String name;
    @OneToMany(fetch=FetchType.LAZY,cascade=CascadeType.PERSIST)
    private Set<UserEntity> user;
複製程式碼

同時設定配置檔案為<prop key="hibernate.hbm2ddl.auto">update</prop>

那麼在專案啟動後會自動生成三張表,分別是

角色表

使用者表

角色使用者表

@Onetomany 的引數:

mappedBy:用於雙向關聯時使用,否則會引起資料不一致的問題。

fetch:可取的值有FetchType.EAGER和FetchType.LAZY,前者表示主類被載入時載入,後者表示被訪問時才會載入

cascade:CascadeType.PERSIST(級聯新建)、CascadeType.REMOVE(級聯刪除)、CascadeType.REFRESH(級聯重新整理)、CascadeType.MERGE(級聯更新)、CascadeType.ALL(選擇全部)

@Manytoone

用於多對一,請看下例,

使用者實體類

複製程式碼
@Entity
@Table(name="user")
public class UserEntity implements Serializable{
    @Id
    @GenericGenerator(name="generator",strategy="uuid")
    @GeneratedValue(generator="generator")
    @Column(name="id")
    private String id;
    @Column(name="userName")
    private String userName;
    @Column(name="password")
    private String password;
    @Temporal(value=TemporalType.TIMESTAMP)
    private Date createDate;
    @ManyToOne(cascade=CascadeType.ALL,fetch=FetchType.LAZY,optional=true)
    @JoinColumn(name="roleid",nullable=true)
    private RoleEntity role;
複製程式碼

 

這樣在專案啟動後只有兩種表

role表

 

 user表

@Manytoone的引數:optional 屬性是定義該關聯類對是否必須存在,值為false時,關聯類雙方都必須存在,如果關係被維護端不存在,查詢的結果為null。 值為true 時, 關係被維護端可以不存在,查詢的結果仍然會返回關係維護端,在關係維護端中指向關係被維護端的屬性為null。 optional 屬性的預設值是true。

其它屬性與onetomany相同。

@JoinColumn

與@Column用法相同,區別是@JoinColumn作用的屬性必須是實體類