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作用的屬性必須是實體類