JPA 学习

1. Entity
Entity是JPA的主体,它主要有以下几个特点
a) 普通POJO对象,在bean里使用new来创建
b) 无需接口的引用
c) 有一个持久化主键(IDENTITY)
d) 会同时包含持久化和非持久化状态(@Transient)
e) 可以是其他Entity或普通类的子类
f) 必须实现Serializable

Entity ID有如下特点,
a) 是数据库的主键
b) @Id 注解单个域,@GeneratedValue,注解自动生成的主键,可以使用GenerationType=SEQUENCE, TABLE, IDENTITY,AUTO 4种方式。
c) @EmbeddedId注解单个域,@IdClass 表示多个Id域,这两种注解都是用来表示复合主键的,在实现的时候必须实现hashCode和equals方法。并且@IdClass的特点是这两个域里的主键名和类型必须和主Entity里的主键名,类型一致。比如,
public class EmployeePK implements Serializable{
private Integer id;
private String name;
...
}

@Entity
@IdClass(EmployeePK.class)
public class Employee implements Serializable{
  @Id
  private Integer id;
  @Id
  private String name;
}
这两个用法主要的区别在于如果还想对Id有Join或GeneratedValue等更细节的具体操作的时候就必须使用IdClass了

d) 必须在Entity的顶级,或是父类里。

Entity的声明周期和操作如下,
persist() 向数据库里插入Entity
remove() 移除数据库里的Entity
merge() 同步已经detached的Entity的状态
refresh() 重新加载Entity的状态


2. Relation
JPA支持单向和双向的关系,关系包括
One to One
a) 声明fetch=LAZY
b) configure nullable = false
One to Many
是ManyToOne的反向关系,一般用mappedBy实现,这样可以不建中间关系表
a) 声明fetch=EAGER
Many to One
a) 声明fetch=LAZY
Many to Many
a) 声明fetch=EAGER
b) @JoinColumn(name = "PERSON_ID", referencedColumnName = "PERSON_ID") colun name 是本表中的字段,referencedColumnName是对方表中的对应字段名

mappedBy指得是如果在某一个POJO里声明了关系,使用JoinColumn之后在其相对应的POJO里只用声明mappedBy并指定其对应POJO里的变量名就可以完成双向关系。

级联的关系也使用在JPA的操作中,级联关系有PERSIST,REMOVE,MERGE,REFRESH,DETACH,ALL.

@OrderBy 可以使用在@OneToMany或@ManyToOne上来指定不通的顺序
@OrderBy("lastname ASC, age DESC");

3. Inheritance
文章很多,主要是表继承
http://hi.baidu.com/xerophyte000/blog/item/32c7887abed441350dd7da5e.html
http://blog.csdn.net/amos1989/article/details/5407082

4. Eclipselink/Toplink特性
a) EntityListener这个不同于JPA的EntityListener,使用的时候可以获得更多的信息和操作。比如:
Pet pet = (Pet)clientSession.readObject(Pet.class);
UnitOfWork uow = clientSession.getActiveUnitOfWork();
    if (uow == null) {
        uow = clientSession.acquireUnitOfWork(); // Start external transaction
        shouldCommit = true;
    }
    Pet petClone = (Pet) uow.registerObject(pet);
    petClone.setName("Furry");
    if (shouldCommit) {
        uow.commit(); // Ask external transaction controller to commit
    }

UnitOfWork 是Session的子类它的解释为
<li> Allow parallel transactions against a session's objects.
<li> Allow nested transactions.
<li> Not require the application to write objects that is changes, automatically determine what has changed.
<li> Perform a minimal commit/update of all changes that occurred.
<li> Resolve foreign keys for newly created objects and maintain referential integrity.
<li> Allow for the object transaction to use its own object space.
其中registerObjects可以将额外的对象关联到现有的事务中提交。

getActiveUnitOfWork()方法返回的是External JTS transaction。 JTS的解释为
Java Transaction Service (JTS) specifies the implementation of a transaction manager that supports the Java Transaction API (JTA) specification (see JSR 907) at the high level and implements the Java mapping of the OMG Object Transaction Service (OTS) specification at the low level. JTS uses the standard CORBA ORB/TS interfaces and Internet Inter-ORB Protocol (IIOP) for transaction context propagation between JTS transaction managers.

A JTS transaction manager provides transaction services to the parties involved in distributed transactions: the application server, the resource manager, the standalone transactional application, and the Communication Resource Manager
也就是说必须在JTA环境下才可以获得,否则为NULL。


当然也可以用acquireUnitOfWork()来创建一个External Transaction,其流程图为



猜你喜欢

转载自shmilywzc.iteye.com/blog/1500016
今日推荐