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作用的属性必须是实体类