jpa配置自动生成表策略分为四种:
先删除表,再创建表,再删除表
2、create 先删除表,再创建表 如果更改了domain类会立即生效
3、update 没有对应表则根据映射关系创建表
表中存在某属性,修改属性长度时不会对表进行更新,需要更新该列时,先删除该列,这时映射表中的这个列属性才会更新到表中
4、validate 表不存在时会抛出异常,domain字段映射比表的列多时会抛异常,反之则不会 项目上线时的配置最好设置成这个
常用的jpa注解:
1、@Entity 类上的注解,注明是该类是实体映射,如果需要自定义表名使用 @Table(name='tableName'),不写默认使用类名作为表名
2、@id 该字段是主键,与之匹配的注解--@GeneratedValue---> (代理主键)
主键生成策略(auto-主键生成策略交给jpa处理、
IDENTITY-主键由数据库自动插入、
SEQUENCE-Oracle不支持ID自增长列,使用序列的机制生成主键ID
TABLE-不清楚干什么的,不怎么使用),
如果没有配置主键生成策略则@Id注解的字段的值必须存在且唯一(也叫做自然主键)
3、@Column 该字段是表中的列映射 -->属性有length、nullable@等 例如: @Cloumn(insertable=false,columnDefinition="int(11)default'25'") 表明该字段不出现在insert语句中,且默认值长度11位,默认值'25'
4、@Temporal(TemportalType.TIMESTAMP) 时间字段,参数是时间类型
5、@Lob 大文本字段
6、@Transient 表明该字段只是一个临时属性,不持久化到数据库
JPA持久对象的状态:
1、临时状态(transient),没有被持久化,不处于entityManager中
2、持久化状态(persistent),已经被持久化加入到entityManager的一级缓存中
3、游离状态(deached)已经被持久化,但不处于entityManager中
4、删除状态(removed)只有调用entityManager.delete(domain)方法,对象有关联ID并且在entityManager管理下,这时是被计划删除,事务提交就正式删除
脏数据更新:一个持久状态的对象在事务管理器内,如果改变原来的数据(主键的值不变),此时出现脏数据,在提交事务的时候会自动发出update语句去修改。
使用jpa时注意的几个点:
1、类不能定义为final类
2、所有属性的类型都必须是包装类
3、必须有默认的无参构造方法