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