paulwong

          My Links

          Blog Stats

          常用鏈接

          留言簿(66)

          隨筆分類(1387)

          隨筆檔案(1145)

          文章分類(7)

          文章檔案(10)

          相冊

          收藏夾(2)

          AI

          Develop

          E-BOOK

          Other

          養(yǎng)生

          微服務(wù)

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          小議JPA

          以前和數(shù)據(jù)庫打交道的標(biāo)準(zhǔn)INTERFACE是JDBC,放SQL語句,執(zhí)行,就可以有結(jié)果。隨著近年ORM的興起,以對象的方式存取數(shù)據(jù)庫大行其道。于是產(chǎn)生了JPA。

          也是一套INTERFACE,以O(shè)RM的方式提供,由廠商實(shí)現(xiàn),如ECLIPSE LINK,HIBERNATE,OPENEJB等。

          ENTITYMANAGERFACTORY:根據(jù)配置文件制造ENTITYMANAGER
          ENTITYMANAGER:以O(shè)RM的方式提供操作數(shù)據(jù)庫的功能
          TRANSACTION:事務(wù)保證
          PERSISTENCE.XML:鏈接數(shù)據(jù)庫信息,事務(wù)類型,重定義JPA的實(shí)現(xiàn)廠商等的配置信息

          在容器環(huán)境下使用:

          如果事務(wù)是RESOURCE_LOCAL的方式,則合用端需干所有的事情,如構(gòu)造ENTITYMANAGER,打開事務(wù),關(guān)閉事務(wù)等。類似于BMT。
          以下是在服務(wù)器環(huán)境中合用RESOURCE_LOCAL型的JPA

          事先要在容器中添加數(shù)據(jù)源。

           persistence.xml
          <?xml version="1.0" encoding="UTF-8" ?>
          <persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">

            <!-- Tutorial "unit" -->
            <persistence-unit name="Tutorial" transaction-type="RESOURCE_LOCAL">
              <non-jta-data-source>myNonJtaDataSource</non-jta-data-source>
              <class>org.superbiz.jpa.Account</class>
            </persistence-unit>

          </persistence>


          import javax.persistence.EntityManagerFactory;
          import javax.persistence.EntityManager;
          import javax.persistence.EntityTransaction;
          import javax.persistence.PersistenceUnit;

          public class MyEjbOrServlet  {

              @PersistenceUnit(unitName="Tutorial")
              private EntityManagerFactory factory;

              // Proper exception handling left out for simplicity
              public void ejbMethodOrServletServiceMethod() throws Exception {
                  EntityManager entityManager = factory.createEntityManager();

                  EntityTransaction entityTransaction = entityManager.getTransaction();

                  entityTransaction.begin();

                  Account account = entityManager.find(Account.class, 12345);

                  account.setBalance(5000);

                  entityTransaction.commit();
              }

              
          }


          以下是JTA方式的JPA,容器+EJB+JPA+JTA,容器會在EJB的方法調(diào)用前打開一個(gè)事務(wù),在方法退出后,提交事務(wù),并且如果是多個(gè)數(shù)據(jù)源的,即有多個(gè)ENTITYMANAGER的
          可以保證一致性,即全局事務(wù)。相當(dāng)于之前的先調(diào)用USERTRANSACTION,BEGIN,COMMIT。

          事先要在容器中添加數(shù)據(jù)源。

           persistence.xml
          <?xml version="1.0" encoding="UTF-8" ?>
          <persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">

            <!-- Tutorial "unit" -->
            <persistence-unit name="Tutorial" transaction-type="JTA">
              <jta-data-source>myJtaDataSource</jta-data-source>
              <non-jta-data-source>myNonJtaDataSource</non-jta-data-source>
              <class>org.superbiz.jpa.Account</class>
            </persistence-unit>

          </persistence>


          EJB
          import javax.ejb.Stateless;
          import javax.ejb.TransactionAttribute;
          import javax.ejb.TransactionAttributeType;
          import javax.persistence.EntityManager;
          import javax.persistence.PersistenceContext;

          @Stateless
          public class MyEjb implements MyEjbInterface {

              @PersistenceContext(unitName = "Tutorial")
              private EntityManager entityManager;

              // Proper exception handling left out for simplicity
              @TransactionAttribute(TransactionAttributeType.REQUIRED)
              public void ejbMethod() throws Exception {

              Account account = entityManager.find(Account.class, 12345);

              account.setBalance(5000);

              }
          }


          如果是J2SE環(huán)境下使用JPA,則又是不一樣的。


          persistence.xml

          <?xml version="1.0" encoding="UTF-8"?>
          <persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">
              <persistence-unit name="SimplePU" transaction-type="RESOURCE_LOCAL">
                  <provider>org.hibernate.ejb.HibernatePersistence</provider>
                  <class>com.someone.jmail.valueobject.CallActivity</class>
                  <class>com.someone.jmail.valueobject.Email</class>
                  <properties>
                      <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
                      <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/test" />
                      <property name="hibernate.connection.username" value="root" />
                      <property name="hibernate.connection.password" value="12345" />
                      <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
                      <property name="hibernate.show_sql" value="false"/>
                      <property name="hibernate.format_sql" value="true"/>
                      <property name="hibernate.use_sql_comments" value="false"/>
                      <property name="hibernate.hbm2ddl.auto" value="none"/>
                  </properties>
              </persistence-unit>
              
          </persistence>


          Dao:

          public class UserDaoImpl implements UserDao { 
           public AccountInfo save(AccountInfo accountInfo) { 
           EntityManagerFactory emf = 
           Persistence.createEntityManagerFactory("SimplePU"); 
           EntityManager em = emf.createEntityManager(); 
           em.getTransaction().begin(); 
           em.persist(accountInfo); 
           em.getTransaction().commit(); 
           emf.close(); 
           return accountInfo; 
              } 
           } 


          posted on 2013-08-14 18:17 paulwong 閱讀(604) 評論(0)  編輯  收藏 所屬分類: J2EE

          主站蜘蛛池模板: 达州市| 慈利县| 神农架林区| 乐东| 兴义市| 鸡东县| 武威市| 淮安市| 绩溪县| 天长市| 维西| 中山市| 绥芬河市| 新沂市| 天祝| 庆云县| 磐石市| 栖霞市| 依安县| 治多县| 武平县| 临高县| 平陆县| 阜新市| 广东省| 金川县| 葵青区| 邯郸县| 盐城市| 福鼎市| 清丰县| 泰宁县| 信宜市| 宁乡县| 弋阳县| 余江县| 龙井市| 延川县| 嘉祥县| 衡水市| 普定县|