JPA持久化API,针对数据库的增删改查(四):实体的基本映射;映射实体类属性;

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();
		}
	}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值