JPA第一个demo

1.认识:持久层框架,操作数据库的框架,相当于是JDBC项目中的dao层
         对数据库的表进行一个映射

2.jpa是规范,hibernate是jpa是实现
3.jdbc和JPA的优缺点

         JDBC:转换麻烦,对对象进行封装然后在进行拆分,移植性效果差,不存在缓存,面向SQL操作
JPA:面向对象操作,操做对象,数据库移植性强,只用重新配置方言就行,存在缓存,一级缓存,二级缓存,查询缓存,不用书写 SQL语句,直接调用方法就是对数据的操作,JPA对性能的优化不是很高。

4.第一个jpa项目
CRUD:
   create建表策略:先删除表名,在创建新表

   update建表策略:先判断数据库是否有该表,没有就直接插入数据,如果没有该表就先创建该表,再向该表插入数据

5.SpringDataJPA的几个核心API
Persistence:用于创建EntityManagerFactory,根据传入的Persistence Unit名称来创建          对应的EntityManagerFactory。
  EntityManagerFactory(线程安全的单例):负责创建EntityManager对象,负责维护数据的二级缓存,重量级对象:配置了太多东西,数据库连接池,二级缓存,预定义的JPQL语句,所有的实体和关系

EntityManager(线程不安全):实体管理对象,提供与持久化相关的操作,有类似Hibernate的Session一级缓存。如果不清空一级缓存的话,获取到的对象会是同一个对象,如果清空了一级缓存,获取到的对象会是不同的对象

EntityTransaction:事务管理对象,只能控制相同一个数据库不同表的事务管理,大多数情况都使用这种

javax.transaction.Transaction  JTA事务,处理不同数据库不同表的事务管理

Tomcat默认不支持JTA事务(不过可以通过添加插件来解决),或者需要用JavaEE服务器:如jboss,weblogic服务器

6.单表映射的配置细节

  要求:
private Long id; //要求:主键,使用数据库的自动生成策略

  private String name;  //要求:varchar(20),数据库名称为username,不能为空,唯一

  private String password;

  private Integer age = 25; //要求:默认值是25,在插入数据时不允许覆盖(添加数据时不操作该字段)

  private Boolean sex;// 数据库没有布尔类型,bit对象

  private BigDecimal salary;// 19,2 工资不能为负数 check(salary>0.0)

  private Date createTime;//包含年月日时分秒,不允许修改

  private Date birthday;//包含年月日

  private Date time;//包含时分秒

  private String text;//这是一个大文本

  private String temp;//这一个字段不要同步到数据库

  持久类映射的配置

  @Entity

public class Employee {

  @Id

  @GeneratedValue(strategy = GenerationType.AUTO)

  private Long id;

  @Column(length = 20, nullable = false, unique = true)

  private String name;

  private String password;

  // default="25"还必须同时配置一个属性insertable ="false",表示不出现在insert语句

  @Column(insertable = false, columnDefinition = "int(11) default '25'")

  private Integer age = 25;

  private Boolean sex;// 数据库没有布尔类型,bit对象

  @Column(columnDefinition = "decimal(19,2) check(salary>0.0)")

  private BigDecimal salary;// 19,2

  // update=false:一经保存就不能修改属性:身份证号码,创建时间

  // 如果填错了,客户不能改,上传身份证照片,找客服,客服验证:程序员留后台hql:

  // update Employee set idcart=? where id=?

  // 创建时间:年月日时分秒

  @Column(updatable = false)

  @Temporal(TemporalType.TIMESTAMP)

  private Date createTime;

  // 生日:年月日

  @Temporal(TemporalType.DATE)

  private Date birthday;

  // 开会时间:时分秒

  @Temporal(TemporalType.TIME)

  private Date time;

  // 大文本

  @Lob

  private String text;

  // 如果name属性希望不持久化数据库

  // @Transient // 临时属性

  private String temp;

原文地址:https://www.cnblogs.com/8888-lhb/p/11235837.html