jpa学习笔记

1.先建表,后跟据表来编写配置文件和实体bean
2.先编写配置文件和实体bean,后建表




注: 1,加入hibernate\lib\jpa中的jpa2.0的jar包


2。将JRE System Library的jdk设置成1.6以上版本


3,将ejb3-persistence去掉
hibernate-jpa-2.0-api-1.0.0.Final和ejb3-persistence有冲突,如果升级到Hibernate3.5那么 可以把ejb3-persistence干掉


jpa所用到的jar包
1.hibernate核心包(8个文件)


2.hibernate注解包(3个文件)
hibernate-annotations.jar
lib\ejb3-persistence.jar
hibernate-commons-annotations.jar


3.hibernate针对jpa的实现包(3个文件)
hibernate-entitymanager-3.4.0.GA


hibernate-eneitymanager.jar
lib\test\log4j.jar
slf4j12.jar
jpa的配置文件
放在类路径下的met-inf目录下persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0">

<!-- transaction-type定义事物类型(全局事物,本地事物) -->
<persistence-unit name="simple" transaction-type="RESOURCE_LOCAL">
<!--
<provider>org.hibernate.ejb.HibernatePersistence</provider>
-->
<properties>
<!-- 数据库方言 -->
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>

<property name = "hibernate.connection.driver_class" value = "com.mysql.jdbc.Driver"/>
<property name = "hibernate.connection.url" value = "jdbc:mysql://localhost:3306/testjpa?useUnicode=treu&amp;characterEncoding=UTF-8"/>
<property name = "hibernate.connection.username" value = "root"/>
<property name = "hibernate.connection.password" value = "yue4512138"/>
<property name="hibernate.hbm2ddl.auto" value="create"/>
</properties>
</persistence-unit>
</persistence>




实体bean
1. @Entity
加注解javax.persistence.Entity


2.@Id(可以标注在属性上面,也可以标注在属性的get方法上面)
实体标识属性
@GeneratedValue生成主键的方式
Strategy=
Auto:JPA根据数据库的情况自己生成主键
Identity:数据库自增
Sequence:序列
Table:表
3.列属性设置
@Column
name:列名
unique:是否唯一
nullable:是否允许为空
4.指定表名
@Table
name:指定生成表的表名
catalog:数据库的名字(一般不用)
5.日期
@Temporal(TemporalType.TIME,TemporalType.Date,TemporalType. TIMESTAMP)
6.枚举类型
@Enumerated(EnumType.STRING)
7.@Lob大数据类型 字节数组
是否延迟加载
@basic(fetch=FetchType.LAZY)
8.该字段不与数据库映射
@Transient
jap中的状态
1.new 新建状态
2.managed 托管状态
3.游离状态(脱管)
4.删除状态
注:如果实体处与事物关联并处于托管状态,如果更改属性则可同步到数据库
//将实体变为游离态
entityManager.clear();


api
entityManager.refersh(实体名);//刷新当前实体内容(数据库作修改操作后)




1.保存一个实体
EntityManagerFactory factory=Persistence.createEntityManagerFactory("testjpa");
EntityManager entityManager=factory.createEntityManager();
//开启事物
entityManager.getTransaction().begin();
entityManager.persist(new Person("岳振华"));

entityManager.getTransaction().commit();
entityManager.close();
factory.close();


2.按标识查询一个实体(可以不开启事物)
// 方法一 类似于get
找不到会返回null
Person person=entityManager.find(Person.class, 1);
//方法二 返回代理对像,
如果不操作该对像,则不查询数据库 如果找不到会报异常

Person person=entityManager.getReference(Person.class, 1);


3. 更新实体
Person person=entityManager.find(Person.class, 1);
System.out.println("姓名:"+person.getName()+" 性别:"+person.getSex());
//将实体变为游离态
entityManager.clear();
person.setName("岳振华");
//将游离状态的实体同步到数据库
entityManager.merge(person);
4.删除实体
Person person=entityManager.find(Person.class, 1);
System.out.println("姓名:"+person.getName()+" 性别:"+person.getSex());
entityManager.remove(person);




查询语句
//查询
EntityManagerFactory emFactory=Persistence.createEntityManagerFactory("testjpa");
EntityManager em=emFactory.createEntityManager();
em.createQuery("select o from person o where o.id=? ");


//删除
Query query=entityManager.createQuery("delete from Person where name =:name");
query.setParameter("name", "岳振华");
query.executeUpdate();






一对多双向关联 多的一端为维护端(外键记录的更新) 默认是延迟加载
@OneToMany(cascade=CascadeType.PERSIST) 级联保存persist
CascadeType.MERGE 级联合并(更新)merge
CascadeType.REFRESH 级联刷新
CascadeType.REMOVE 级联删除


fetch=FetchType.EAGER 不延迟
fetch=FetchType.LAZY 延迟
mappedBy="Order"对方的某个属性名维护(多的一方维护)
@ManyToOne(cascade=CascadeType.PERSIST,
optional=true)//可选可以为空

猜你喜欢

转载自retacn-yue.iteye.com/blog/1708430
今日推荐