没有学习之前就听说过 JPA ,开始想自学来着.不知道为什么总是感觉这个技术很难.所以都没有尝试过.今天通过老师的讲解,很快就上手了.呵呵,好多问题其实没有自己想象的那样难. 这个人真的是感觉有点意思. JPA 的为了使项目中持久层的 ORM 和项目解耦而出现的技术.无论项目的持久层由什么 ORM 来实现都对项目上层调用的代码没有影响.这里我们用 hibernate 来是 JPA 的实现.
1.初始化
EntityManagerFactory emf = Persistence.createEntityManagerFactory("manager1");
还有另一种方法
Map configOverrides = new HashMap();//可编程配置
configOverrides.put("hibernate.hbm2ddl.auto", "create-drop");
EntityManagerFactory programmaticEmf = Persistence.createEntityManagerFactory("manager1", configOverrides);
注: 启动时,ClassLoader.getResource("META-INF/persistence.xml")
2.实体
@Entity
public class Employee {
age ;
setxxx();
}
总结:
每个实体必须有 ID,映射到主键,ID 必须定义在等级实体树的根上/超类上
ID应该是简单类型
@id实体中的单个字段/属性
@GeneratedValue可以采用几种策略自动生成值
SEQUENCE
TABLE
IDENTITY
AUTO
ID可以是用户定义的类(联合主键)
@Entity声明实体bean,类级别定义.基于字段/基于方法的持久化
@id 定义id属性,相当于Hibernate中的OID.这两个注解必须显式指定,其他的映射是隐 式(默认)的.根据采用的注解位置(字段注解/方法注解),Hibernate会采用相应的访问类型 (access=field|property).EJB3规范在被访问的元素类型上声明注解.比如方法访问,需要在getXXX上声明注解,字段级访问 就在属性上声明注解.不支持混合使用.Hibernate会通过@id/@Embeddedid的位置来判断采用哪种访问方式.
3.实体管理器
EntityManagerFactory emf = Persistence.createEntityManagerFactory("manager1")
EntityManager em = emf.createEntityManager();
em.xxx();
em.close();
emf.close();
4.事务类型
Resource-local事务
JTA(Java Transaction Api)多个资源参与(多个数据库)
XA(分布式XA资源)
总结:
事务类型定义在持久化单元中 (persistence.xml)
Jee环境中默认是JTA
J2se环境中默认是Resource-local
5.@TransactionAttribute 注解
TransactionAttributeType.REQUIRED
TransactionAttributeType.REQUIRES_NEW
TransactionAttributeType.MANDATORY
TransactionAttributeType.NOT_SUPPORTED
TransactionAttributeType.NEVER
TransactionAttributeType.SUPPORTS
6.JPA的CRUD操作
EntityManager
相当于 hibernate 中的 session.控制实体的生命周期.
Persist()
Remove()
Merge()
Refresh()
CRUD的API方法:
em.persist(order);
em.find(Order.class,new Long(1));
em.remove(order);
em.merge(order);
7.JPA的映射
1)映射clob/blob
@Lob
@Basic(fetch=FetchType.LAZY)
protected byte[] picture;
注释:
mysql数据库在映射boolean类型时,数据库中的类型默认建成bit类型,查询出错, @Lob会生成blob类型.都需要手动进行修改.没有给出在注解中显示指定字段类型的属性.
2)指定表
@Table(name="USERS")
public class User
@Table(name="CATEGORIES",
uniqueConstraints=
{@UniqueConstraint(columnNames={"CATEGORY_ID"})})
uniqueConstraints只用于在自动建表时为某些列添加唯一性约束.
3)映射列:@Column(name="USER_ID")
4)临时字段:@Transient
5)组成关系:@Embeddable[相当于hibenrate的component]
6)映射 Embeddable类: @Embedded ,可以通过@AttributeOverride注解来覆盖Embeddable类中指定字段属性.更新地址属性的问题.
7)映射实体到多个表:
@Entity
@Table(name="users")
@SecondaryTable(name="user_photos", pkJoinColumns=@PrimaryKeyJoinColumn(name="USER_ID"))
public class User implements Serializable {
..
@column(table="user_photos",name="photo")
private byte[] getPhoto(){..}
8)生成主键值:
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="user_id")
protected Long userId;
SEQUENCE和TABLE策略都必须先定义生成器之后才能使用.
序列:@SequenceGenerator(name="user_seqgen",
sequenceName="seq_users",
initialValue=1, allocationSize=10)
9)序列表生成器
@TableGenerator (name="tabgen_person",
table="table_persons_id",
pkColumnName="pk",
valueColumnName="pkvalue",
pkColumnValue="pkvalue"),
allocateSize=10)
@Id
@GeneratedValue(strategy=GenerationType.TABLE,
generator="tabgen_person ")
@Column(name="id")
protected Long userId;
生成的表含有两个字段:主键列字段和值列字段.该表只有一条记录.所以还要给主键列指定主键值. 默认的主键生成策略 @GeneratedValue(strategy=GenerationType.AUTO)
传智播客--JPA的CRUD操作,映射实体
最新推荐文章于 2024-08-25 21:18:14 发布