查看文章 |
Lob字段 @Entity(name = "T_POST") public class Post implements Serializable { @Lob //JPA通过@Lob将属性标注为Lob类型 @Basic(fetch = FetchType.EAGER) //通过@Basic指定Lob类型数据的获取策略,FetchType.EAGER表示非延迟加载 @Column(name = "POST_TEXT", columnDefinition = "LONGTEXT NOT NULL") //postText属性对应T_POST表的POST_TEXT字段,该字段的类型是LONGTEXT,非空 private String postText; @Lob @Column(name = "POST_ATTACH", columnDefinition = "BLOB") //通过@Column的columnDefinition指定数据表对应的Lob字段类型 @Basic(fetch = FetchType.LAZY) //FetchType.LAZY表示延迟加载 private byte[] postAttach; } 关于XML元数据 按照JPA的规范,如果你提供了XML元数据描述信息,它将覆盖实体类中的注解元数据信息,XML元数据以orm.xml 命名,放置在类路径的META-INF目录下
JPA重要API JPA接口位于javax.persistence和javax.persistence.spi两个包中,javax.persistence包中大部分API都是注解类、EntityManager、Query等持久化操作接口。而javax.persistence.spi包中的4个API,是JPA的服务层接口
EntityManager 实体对象由实体管理器进行管理,通过EntityManager和持久化上下文进行交互 实体管理器有两种: 容器类:容器型的实体管理器由容器负责试题管理器之间的协作,Java EE应用服务器提供的就是管理型的实体管理器。 应用程序型:实体管理器的生命周期由应用程序控制,应用程序通过javax.persistence.EntityManagerFactoty的creaeEntityManager创建EntityManager实例
实体的状态 实体共有4种状态: 1、 新建态:新创建的实体对象,尚未拥有持久化主键,没有和一个持久化上下文关联起来 2、 受控态:已经拥有持久化主键和持久化上下文建立了联系 3、 游离态:拥有持久化主键,但尚未和持久化上下文建立联系 4、 删除态:拥有持久化主键,已经和持久化上下文建立了联系,但已经被安排从数据库中删除
EntityManager的API
void persist(Object entity) 通过persist方法,新实体实例将转换为受控状态,就是说,当persist()方法所在的事务提交时,实体的数据保存到数据库中。 如果实体已经被持久化,那么调用persist()方法不会发生任何事情。 如果对一个已经删除的实体调用persist()方法,删除态的实体又转变为受控态 如果对游离状态的实体执行persist()操作,抛出IllegalArgumentException 一个实体调用persist()方法后,所有与之关联的实体,都将执行持久化操作
void remove(Object entity) 删除一个受控态的实体。 如果实体声明为级联删除(cascade=REMOVE或者cascade=ALL),被关联的实体也会被删除 在一个新建态或删除态的实体上调用remove()方法,将被忽略 在游离态的实体上调用remove()方法,将抛出IllegalArgumentException,相关事务将回滚
void flush() 将受控态的实体数据同步到数据库中
T merge(T entity) 将一个游离态的实体持久化到数据库中,并转换为受控态的实体
T find(Class entityClass.Object primaryKey) 以主键查询实体对象,entityClass是实体的类,primaryKey是主键值 Eg:Topic t = em.find(Topic.class,1); |

