SpringDataJpa基础篇1:实体类常用注解

SpringDataJpa下的实体类使用注解都是javax.persistence包下的注解。

1、实体类中常用注解

【1、@Entity和@Table(name="")注解】

       @Entity和@Table(name="")注解:表明这是一个实体类。一般用于jpa这两个注解一般一块使用,但是如果表名和实体类名相同的话,@Table注解可以省略。

【2、@Id注解】

@Id表示该属性为主键;

【3、自定义主键生成策略@GeneratedValue】

     @GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "repair_seq"):表示主键生成策略是sequence(可以为Auto、IDENTITY、native等,Auto表示可在多个数据库间切换),指定sequence的名字是repair_seq。

自定义主键生成策略需要使用@GeneratedValue注解和@GenericGenerator注解。 

【4、@Column注解】

@Column表示列的说明,如果字段名与列名相同,则可以省略。@Column注解属性详细说明

(1)name属性:被标注字段在数据库表中所对应字段的名称;
(2)length属性:表示该字段的长度,当字段的类型为varchar时,该属性才有效果,默认为255个字符;
(3)nullable属性:表示该字段是否可以为null值,默认是true。
(4)unique属性:表示该字段是否为唯一标识,默认fasle。
(5)precision和scale属性:precision属性和scale属性表示精度,当字段类型为double时,precision表示数值的总长度,scale表示小数点所占的位数。

【5、@Transient注解注解】

      @Transient表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性.如果一个属性并非数据库表的字段映射,就务必将其标示为@Transient,否则,ORM框架默认其注解为@Basic。

【6、@Temporal注解】

@Temporal注解表示格式化时间日期。有三种,默认是@Temporal(TemporalType.TIMESTAMP)。具体如下:
(1)@Temporal(TemporalType.DATE):日期,页面取得结果格式如:2016-08-05
(2)@Temporal(TemporalType.TIME):时间,页面取得结果是: 13:46:25
(3)@Temporal(TemporalType.TIMESTAMP):时间和日期,页面取得结果是:2016-08-05 13:46:25
     @JsonView注解用来过滤序列化对象的字段属性,简单来说就是定义一个标签,根据controller的JsonView属性,将实体类中不同标签的属性进行分类显示。

【7、@OneToOne一对一注解】

@OneToOne注解说明:
(1)targetEntity属性表示默认关联的实体类型,默认为当前标注的实体类;
(2)cascade属性表示与此实体一对一关联的实体的联级样式类型。联级样式上当对实体进行操作时的策略。说明:在定义关系时经常会涉及是否定义Cascade(级联处理)属性,担心造成负面影响. 不定义,则对关系表不会产生任何影响
   ①CascadeType.PERSIST (级联新建)
   ②CascadeType.REMOVE (级联删除)
   ③CascadeType.REFRESH (级联刷新)
   ④CascadeType.MERGE (级联更新)中选择一个或多个。
   ⑤还有一个选择是使用CascadeType.ALL ,表示选择全部四项
(3)fetch属性是该实体的加载方式,有两种:LAZY和EAGER。
(4)optional属性表示关联的实体是否能够存在null值。默认为true,表示可以存在null值。如果为false,则要同时配合使用@JoinColumn标记。
(5)mappedBy属性用于双向关联实体时,标注在不保存关系的实体中。

【8、@OneToMany一对多注解】

例如一个公司对应多个部门,可以通过公司获取到其下面的多个部门信息。即公司表与部门表之间是一对多的关系;@OneToMany注解说明
(1)targetEntity属性表示默认关联的实体类型,默认为当前标注的实体类;因为一对多的实体集合时保存在集合类中,因此必须指明集合类中保存的具体类型。
(2)mappedBy属性用于双向关联实体时使用。

【9、@JoinColumn注解】

@JoinColumn(name=”loginId”):在一对一关系时:本表中指向另一个表的外键。一对多关系时:另一个表指向本表的外键。该注解属性详细说明:

(1)name属性是用来标记表中对应的字段的名称。如果不设置name的值,默认情况下,name的取值规则如下:
    name=关联的表的名称 + "_" + 关联表主键的字段名
(2)默认情况下,关联的实体的主键一般用来做外键的。如果不想用主键作为外键,则需要设置referencedColumnName属性,如@JoinColumn(name="address_id", referencedColumnName="ref_id")
【注意】@JoinColumn可以与@OneToOne、@ManyToOne或@ManyToMany标记同时使用。
1)一对一和多对一的@JoinColumn注解的都是在“主控方”,都是本表指向外表的外键名称。
2)一对多的@JoinColumn注解在“被控方”,即一的一方,指的是外表中指向本表的外键名称。
3)多对多中,joinColumns写的都是本表在中间表的外键名称,inverseJoinColumns写的是另一个表在中间表的外键名称。

【10、@JoinTable中间表注解】

@JoinTable注解属性说明:
(1)name属性为连接两个表的表名称。若不指定,则使用默认的表名称,格式如下:    "表名1" + "_" + "表名2"
(2)joinColumn属性表示,在保存关系的表中,所保存关联关系的外键的字段,并配合@JoinColumn标记使用;
(3)inverseJoinColumn属性与joinColumn类似,它保存的是保存关系的另外一个外键字段;
(4)catalog和schema属性表示实体指定点目录名称或数据库名称;
(5)uniqueConstraints属性表示该实体所关联的唯一约束条件,一个实体可以有多个唯一约束条件,默认没有约束;
【注意】:@JoinTable不仅能够定义一对多的关联,也可以定义多对多表的关联。

#角色表Role与资源表Resource之间是多对多的关系,之间的中间表是sys_role_resource。
------------------------------------------------------------------------------------
@ManyToMany(targetEntity=Resource.class)
@JoinTable(name="sys_role_resource",joinColumns=@JoinColumn(name="role_id"),inverseJoinColumns=@JoinColumn(name="resource_id"))
private Set<Resource> resources=new HashSet<Resource>(0);
------------------------------------------------------------------------------------------
#@JoinTable 描述了多对多关系的数据表关系。name 属性指定中间表名称,joinColumns 定义中间表与Resource资源表的外键关系。上面的代码中,中间表sys_role_resource的role_id 列是Role角色表的主键列对应的中间表外键列,inverseJoinColumns 属性定义了中间表与另外一端(Resource)的外键关系。

【@IdClass注解】

@IdClass注解就是复合主键时候使用,复合主键由多个主键字段组成。

@Entity @IdClass(ProjectId.class)
public class Project {
    @Id int departmentId;
    @Id long projectId;
}
//这里主键是由departmentId和projectId字段共同组成的主键

2、应用

2.1、多对多个关系应用

我们这里的就用角色表与菜单表来进行说明,

#角色表
@Entity
@Table(name="t_roles")
public class Roles {
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(name="roleid")
	private Integer roleid;
	
	@Column(name="rolename")
	private String rolename;
	@ManyToMany(cascade=CascadeType.PERSIST,fetch=FetchType.EAGER)
	//@JoinTable:映射中间表
	//joinColumns:当前表中的主键所关联的中间表中的外键字段
	@JoinTable(name="t_roles_menus",joinColumns=@JoinColumn(name="role_id"),inverseJoinColumns=@JoinColumn(name="menu_id"))
	private Set<Menus> menus = new HashSet<>();
...................get和set方法省略......................
}
#菜单表
@Entity
@Table(name="t_menus")
public class Menus {
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(name="menusid")
	private Integer menusid;	
	@Column(name="menusname")
	private String menusname;	
	@Column(name="menusurl")
	private String menusurl;	
	@Column(name="fatherid")
	private Integer fatherid;
	
	@ManyToMany(mappedBy="menus")
	private Set<Roles> roles = new HashSet<>();
}

猜你喜欢

转载自blog.csdn.net/u013089490/article/details/84956736