概述
1.实体的基本映射
前面已经介绍了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.映射实体类属性
在默认情况下,被@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.在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,作为一个普通属性存在于对象中,不进行持久化
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..在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,针对数据库的增删改查(四):实体的基本映射;映射实体类属性;所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复