1. 程式人生 > >JPA視訊學習筆記

JPA視訊學習筆記

JPA
一、
06年就出來了
Java Persistence API
是Sun官方提出的Java持久化規範
為開發人員提供一種物件/關係對映工具來管理java應用中的關係資料
作用:簡化現有持久化開發工作
      整合ORM技術
API實現框架有:Hibernate TopLink JDO等
目前應用不廣,但是會是未來的趨勢     


API包括三方面的技術:
1、ORM對映元資料
  JPA支援XML和JDK5.0的註解
  元資料:描述物件和表的對映關係
2、Java持久化API
3、查詢語言
   
二、
用Hibernate框架開發JPA需要的jar包


Hibernate核心包(8個檔案)
hibernate-distribute-3.3.1.GA
hibernate3.jar
lib\byecode\cglib\hibernate-cglib-repack-2.1_3.jar
lib\required\*.jar


Hibernate註解包(3個檔案)
hibernate-annotations-3.4.0.GA
hibernate-annotation.jar
lib\ejb3-persistence.jar
lib\hibernate-commons-annotations.jar


Hibernate針對JPA的實現包(3個檔案)
hibernate-entitymanager-3.4.0.GA
hibernate-entitymanager.jar
lib\test\log4j.jar
lib\test\slf4j-log4j12.jar



三、persistence.xml
事物:
全域性事物:
JTA.getUserTrantion().begin();
connectin = mysql
connection = oracle
connection -> update mysql set amount=amount-xx where id=xxx(mysql)
connection -> update mysql set amount=amount+xx where id=bbb(oracle)
JTA.getUserTrantion().commit();


兩次提交協議 
本地事物:
針對一個數據庫操作


<?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">


    <persistence-unit name="spring_jpa_jsf"
        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://172.23.1.198:3306/spring_jpa_jsf?createDatabaseIfNotExist=true&amp;useUnicode=true&amp;characterEncoding=utf-8" />
            <property name="hibernate.connection.username"
                value="root" />
            <property name="hibernate.connection.password"
                value="123" />
            <property name="hibernate.hbm2ddl.auto" value="update" />
            <property name="hibernate.show_sql" value="true" />
        </properties>
    </persistence-unit>
</persistence>


四、
@Entity
@Id @GeneratedVlaue


Person p = new Person();
EntityManagerFactory emf = Persistence.createEntityManagerFactory("");
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
em.persist(p);
em.getTransaction().commit();
em.close();
emf.close();




五、
@Table(name="xxx")
日期註解
@Temporal(TemporalType.DATE)
列舉
@Enumerated(EnumType.STRING)


@Column(length=5,nullable=false)


給預設值
private String name = "xwq";


六、大文字和二進位制資料
大文字
private String info;
@Lob
public String getInfo()


二進位制資料
private Byte[] file;
@Lob
public Byte getFile()


不想成為持久化資料(不和表中對應)
@Transient


延遲載入(一般用在大資料上面,避免不需要此資料的時候才佔用記憶體)
@Basic(fetch=FetchType.LAZY)


七、載入、更新、刪除物件
查詢:
Person p = em.find(Person.class,1);//相對hibernate get方法
沒有資料 會返回null


Person p = em.getReference(Person.class,1); //相對hibernate load方法
返回的只是代理物件,p.getName() 才去載入資料
沒有資料會報異常,在用該物件時才會報異常


更新:
Person person = em.find(Person.class,1);
person.setName("haha");


四種實體狀態:
1、新建 new
2、託管 managed  自動和資料庫同步
3、遊離  
em.clear() //把實體管理器中的所有實體變成遊離狀態
em.merger(person)  //把遊離狀態的物件更新同步到資料庫
4、刪除


刪除:
Person person = em.find(Person.class,1);
em.remove(person);


八、內部原理
Persistence.createEntityManagerFactory();


JPA會從類路徑下META-INF/services找到這個檔案javax.persistence.spi.PersistenceProvider
建立EntityManagerFactory 物件


九、JPQL查詢語句
Query query = em.createQuery("select p from Person p where p.id=?1");
query.setParameter(1,2);
查詢
query.getResultList();
query.getSingleResult();
刪除 更新
query.executeUpdate();