我是靠谱客的博主 彪壮大象,这篇文章主要介绍JPA持久化API,针对数据库的增删改查(四):实体的基本映射;映射实体类属性;,现在分享给大家,希望可以做个参考。

1.实体的基本映射

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
前面已经介绍了JPA的3大核心组件:EntityManager,实体和JPQL(针对JPA查询), 其中EntityManager是JPA执行持久化操作的核心API,而实体则是EntityManager管理的对象。 对于绝大部分普通开发者来说,开发JPA实体可能是经常做的工作 虽然JPA可以使用XML映射文件来管理实体与数据库之间的映射关系,但在实际开发中, 绝大部分情况都是采用Annotation来管理实体和数据的映射关系 对于一个JPA实体类而言,通常可以采用如下两个Annotation来修饰它 1.@Entity 被该Annotation 注解修饰的POJO是一个实体,使用该Annotation时可指定一个name属性, 那么属性指定该实体实体名称,但大部分时候无需指定该属性,因为系统默认以该类的类名作为实体的名称 2.@Table 该Annotation指定实体所映射的表,直接对应一张表(emp 实际表名 保持一致) @table支持的属性: 1.catalog 非必须 设置实体所映射的表放入指定的catalog内。如果没有指定该属性,数据表将放入默认的catalog内 2.name 非必须 设置实体所映射的表放入指定的catalog内,如果没有指定该属性,数据表将默认放入catalog内 3.schema 非必须 设置实体所映射的表名,如果没有指定该属性,那么该表的表名将于实体类的类名相同 4.uniqueConstraints 非必须 为实体所映射的表设置唯一约束,该属性值可以是一个@UniqueConstraint Annotation数组 @UniqueConstraint 用于为数据表定义唯一约束,它的用法非常简单,使用该Annotation时可以指定如下唯一属性 columnNames:该属性的属性值是一个字符串数组,每个字符串元素代表一个数据列。使用上面Annotation修饰了实体类型之后,接下来为实体映射配置更详细的信息

2.映射实体类属性

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
在默认情况下,被@Entity修饰的实体的所有属性都会被映射到底层数据表。正如前面介绍ORM时所指出的, 这些属性通常都会映射到底层数据表的一列,为了指定某个属性所映射的数据列的详细信息, 如列名,列字段长度等,可以在实体类中使用@Column修饰该属性 1.@Column支持的属性: 1.insertable 非必须 指定该列是否包含在JPA生成的insert语句的列列表中。默认为true 2.length 非必须 指定该列所能保存的数据的最大长度。默认值为255 3.name 非必须 指定该列的列名。该列的列名默认与@Column修饰的属性的属性名字相同 4.nullable 非必须 指定该列是否允许为null,默认为true 5.table 非必须 指定该列所述的表名。当需要用多个表来保存一个实体时往往指定该属性 6.unique 非必须 指定该列是否具有唯一约束,默认值为false,则不具有唯一约束 7.updatable 非必须 指定该列是否包含在JPA生成的UPDATE语句的列列表中。默认值为true 2.@Transient,使用@Transient修饰不想持久保存的Field 在默认情况下,实体类的Field会自动映射到数据表的数据列。如果在实际应用中不想持久保存某些Field,则可以考虑使用@Transient来修饰它们

eg:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//1.在Emp类中新建属性,生成getter setter方法 @Transient//不向数据库保存 不进行持久化 普通属性 private boolean flag; //2.测试类 @Test public void testTransient() { EntityManager em = emf.createEntityManager(); try { Emp emp = new Emp(); emp.setEmpno(7); emp.setEname("ZZJ"); emp.setJob("Manger"); emp.setFlag(true); em.getTransaction().begin(); em.persist(emp); em.getTransaction().commit(); System.out.println("SUCCESS"); System.out.println(emp.getEmpno()+" "+emp.getEname()+" "+emp.getJob()+" "+emp.isFlag()); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); em.getTransaction().rollback(); }finally { em.close(); } }

执行后发送的SQL语句并没有Flag,作为一个普通属性存在于对象中,不进行持久化

复制代码
1
2
3
4
5
6
7
8
9
10
3.使用@Temporal修饰日类型的Field 对于Java程序而言,表示日期类型只有两种:java.util.Date和java.util.Calender; 但对于数据库而言,表示日期,时间的类型就比较多,如date,time,datetime,timestamp等。 在这样的背景下,当在实体中定义了一个java.util.Date类型的Field时,JPA到底是将这种类型的Field映射成date类型的列? time类型的列?还是timestamp类型的列,这对JPA来说有些难以抉择。在这样的情况下, 我们可以使用@Temporal来修饰这种类型的Field,使用@Temporal时可指定一个value属性, 该属性支持TemporalType.Date,TemporalType.TIME,TemporalType.TIMESTAMP三个值之一, 用于指定该Field映射到数据表的date,time和timestamp类型的数据列

eg:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//1..在Emp类中新建属性,生成getter setter方法 @Temporal(TemporalType.DATE)//日期类型 private Date hiredate; //2.测试类 @Test public void testTemporal() { EntityManager em = emf.createEntityManager(); try { Emp emp = new Emp(); emp.setEmpno(8); emp.setEname("ZZJ"); emp.setJob("Manger"); // SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd"); // Date date = sf.parse("2020-05-28"); // emp.setHiredate(date); emp.setHiredate(new SimpleDateFormat("yyyy-MM-dd").parse("2020-02-02")); em.getTransaction().begin(); em.persist(emp); em.getTransaction().commit(); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); em.getTransaction().rollback(); }finally { em.close(); } }

最后

以上就是彪壮大象最近收集整理的关于JPA持久化API,针对数据库的增删改查(四):实体的基本映射;映射实体类属性;的全部内容,更多相关JPA持久化API,针对数据库内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(64)

评论列表共有 0 条评论

立即
投稿
返回
顶部