jpa学习笔记

来源:互联网 发布:安卓编程入门教程pdf 编辑:程序博客网 时间:2024/05/20 21:49
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)//可选可以为空
原创粉丝点击