JPA实体注解用例项目地址
https://github.com/lx-sunday/springboot-jpa.git
参考博客:
http://blog.sina.com.cn/s/blog_49fd52cf0100scql.html
ManyToOne
关系的拥有方(即Many的一方)负责关系的维护,在拥有方建立外键会用到JoinColumn。列举使用ManyToOne进行实体注解,如创建一个分类树形结构的实体。
/**
* 当前实体中ManyToOne与OneToMany对应的实体都是本身
* @author lx
*
*/
@Entity
@Table(name="category")
public class Category implements Serializable{
private static final long serialVersionUID = 3056901912384376245L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(name="name")
private String name;
/**
* 关系的拥有方(即Many的一方)负责关系的维护,在拥有方建立外键,会用到JoinColumn
*/
@ManyToOne
@JoinColumn(name="pid")
private Category parent;
/**
* 用于双向关联,由one的一方指向many的一方,同时这个属性为one的一方在many一方的属性值
*/
@OneToMany(mappedBy="parent",fetch=FetchType.EAGER)
private List<Category> childList;
}
OneToMany
1:mappedBy属性用于双向关联,由one的一方指向many的一方,同时这个属性为one的一方在many一方的属性值,如上面的父级分类对应多个子级分类。
2:与@JoinTable结合一起实现表关联
@Target({METHOD, FIELD})
public @interface JoinTable{
String name() default “”;
String catalog() default “”;
String schema() default “”;
JoinColumn[] joinColumns() default {};
JoinColumn[] inverseJoinColumns() default {};
UniqueConstraint[] uniqueConstraints default {};
}
name属性:为连接两个表的表名称。若不指定,则使用默认的表名称,格式如下:“表名1” + “_” + “表名2”。
joinColumns属性:在保存关系的表中,所保存关联关系的外键的字段,并配合@JoinColumn标记使用。
inverseJoinColumns属性:与joinColumns类似,它保存的是保存关系的另外一个外键字段。
catalog和schema属性:表示实体指定点目录名称或数据库名称。
uniqueConstraints属性:表示该实体所关联的唯一约束条件,一个实体可以有多个唯一约束条件,默认没有约束。
注意:@JoinTable不仅能够定义一对多的关联,也可以定义多对多表的关联。
列举通过@JoinTable创建关联表,如一个分组中存在多个用户,用第三张表group_user来保存分组用户关系:
@Entity
@Table(name="groups")
public class Groups implements Serializable {
/**
*
*/
private static final long serialVersionUID = -6655151439368207897L;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
private String name;
/**
* 表关联,通过JoinTable创建关联表
*/
@OneToMany(fetch=FetchType.EAGER)
@JoinTable(name="group_user",
joinColumns={@JoinColumn(name="group_id",referencedColumnName="id")},
inverseJoinColumns={@JoinColumn(name="user_id", referencedColumnName="id")}
)
private List<Users> userList;
}
Cascade
一般这个对象归你控制你就可以级联,不归你控制你就不要设置级联。OneToMany与OneToOne可以使用级联,ManyToMany与ManyToOne一般不使用级联。
说明:在定义关系时经常会涉及是否定义Cascade(级联处理)属性,担心造成负面影响.
·不定义,则对关系表不会产生任何影响
·CascadeType.PERSIST (级联新建)
·CascadeType.REMOVE (级联删除)
·CascadeType.REFRESH (级联刷新)
·CascadeType.MERGE (级联更新)中选择一个或多个。
·还有一个选择是使用CascadeType.ALL ,表示选择全部四项