1. 程式人生 > >日系框架之seasar2(S2JPA之OpenJPA)

日系框架之seasar2(S2JPA之OpenJPA)

MySql上新建資料庫s2openjpa,並執行如下DDL:

  1. SET FOREIGN_KEY_CHECKS=0
  2. -- ---------------------------- 
  3. -- Table structure for dept 
  4. -- ---------------------------- 
  5. CREATE TABLE `dept` ( 
  6.   `deptno` int(11) NOT NULL, 
  7.   `active` bit(1) NOT NULL, 
  8.   `dname` varchar(255) default NULL, 
  9.   `loc` varchar(255) default NULL, 
  10.   `versionNo` int(11) NOT NULL, 
  11.   PRIMARY KEY  (`deptno`) 
  12. ENGINE=InnoDB DEFAULT CHARSET=latin1
  13. -- ---------------------------- 
  14. -- Table structure for emp 
  15. -- ---------------------------- 
  16. CREATE TABLE `emp` ( 
  17.   `empno` bigint(20) NOT NULL, 
  18.   `city` varchar(255) default NULL, 
  19.   `zip` varchar(255) default NULL, 
  20.   `comm` float default NULL, 
  21.   `ename` varchar(255) default NULL, 
  22.   `hiredate` date default NULL, 
  23.   `job` varchar(255) default NULL, 
  24.   `mgr` smallint(6) default NULL, 
  25.   `sal` float default NULL, 
  26.   `tstamp` datetime default NULL, 
  27.   `deptno` int(11) default NULL, 
  28.   PRIMARY KEY  (`empno`), 
  29.   KEY `FK110A8F5074ABE` (`deptno`), 
  30.   CONSTRAINT `FK110A8F5074ABE` FOREIGN KEY (`deptno`) REFERENCES `dept` (`deptno`) 
  31. ENGINE=InnoDB DEFAULT CHARSET=latin1
  32. -- ---------------------------- 
  33. -- Records  
  34. -- ---------------------------- 
  35. INSERT INTO `dept` VALUES ('10', '', 'ACCOUNTING', 'NEW YORK', '0'); 
  36. INSERT INTO `dept` VALUES ('20', '', 'RESEARCH', 'DALLAS', '0'); 
  37. INSERT INTO `dept` VALUES ('30', '', 'SALES', 'CHICAGO', '0'); 
  38. INSERT INTO `dept` VALUES ('40', '', 'OPERATIONS', 'BOSTON', '0'); 
  39. INSERT INTO `emp` VALUES ('7369', 'LAS VEGAS', '110', null, 'SMITH', '1980-12-17', 'CLERK', '7902', '800', '2000-01-01 00:00:00', '20'); 
  40. INSERT INTO `emp` VALUES ('7499', 'MIAMI', '120', '300', 'ALLEN', '1981-02-20', 'SALESMAN', '7698', '1600', '2000-01-01 00:00:00', '30'); 
  41. INSERT INTO `emp` VALUES ('7521', 'WASHINGTON', '130', '500', 'WARD', '1981-02-22', 'SALESMAN', '7698', '1250', '2000-01-01 00:00:00', '30'); 
  42. INSERT INTO `emp` VALUES ('7566', 'IOWA CITY', '140', null, 'JONES', '1981-04-02', 'MANAGER', '7839', '2975', '2000-01-01 00:00:00', '20'); 
  43. INSERT INTO `emp` VALUES ('7654', 'LOS ANGELES', '150', '1400', 'MARTIN', '1981-09-28', 'SALESMAN', '7698', '1250', '2000-01-01 00:00:00', '30'); 
  44. INSERT INTO `emp` VALUES ('7698', 'LOS ANGELES', '160', null, 'BLAKE', '1981-05-01', 'MANAGER', '7839', '2850', '2000-01-01 00:00:00', '30'); 
  45. INSERT INTO `emp` VALUES ('7782', 'WASHINGTON', '170', null, 'CLARK', '1981-06-09', 'MANAGER', '7839', '2450', '2000-01-01 00:00:00', '10'); 
  46. INSERT INTO `emp` VALUES ('7788', 'NEW YORK', '180', null, 'SCOTT', '1982-12-09', 'ANALYST', '7566', '3000', '2005-01-18 13:09:32', '20'); 
  47. INSERT INTO `emp` VALUES ('7839', 'SEATTLE', '190', null, 'KING', '1981-11-17', 'PRESIDENT', null, '5000', '2000-01-01 00:00:00', '10'); 
  48. INSERT INTO `emp` VALUES ('7844', 'NEW YORK', '210', '0', 'TURNER', '1981-09-08', 'SALESMAN', '7698', '1500', '2000-01-01 00:00:00', '30'); 
  49. INSERT INTO `emp` VALUES ('7876', 'SANTA FE', '220', null, 'ADAMS', '1983-01-12', 'CLERK', '7788', '1100', '2000-01-01 00:00:00', '20'); 
  50. INSERT INTO `emp` VALUES ('7900', 'NEW YORK', '230', null, 'JAMES', '1981-12-03', 'CLERK', '7698', '950', '2000-01-01 00:00:00', '30'); 
  51. INSERT INTO `emp` VALUES ('7902', 'SANTA FE', '240', null, 'FORD', '1981-12-03', 'ANALYST', '7566', '3000', '2000-01-01 00:00:00', '20'); 
  52. INSERT INTO `emp` VALUES ('7934', 'IOWA CITY', '250', null, 'MILLER', '1982-01-23', 'CLERK', '7782', '1300', '2000-01-01 00:00:00', '10');

變更jar包一覽如下:

aopalliance-1.0.jar
commons-collections-3.2.jar
commons-lang-2.1.jar
commons-logging-1.1.jar
commons-pool-1.3.jar
ejb3-persistence.jar
geronimo-annotation_1.0_spec-1.0.jar
geronimo-ejb_3.0_spec-1.0.jar
geronimo-interceptor_3.0_spec-1.0.jar
geronimo-j2ee_1.4_spec-1.0.jar
javassist-3.4.GA.jar
jboss-archive-browsing-5.0.0alpha-200607201-119.jar
jta-1.1.jar
junit-3.8.2.jar
log4j-1.2.13.jar
mysql-connector-java-5.1.6-bin.jar
ognl-2.6.9-patch-20070908.jar
openjpa-1.1.0.jar
poi-3.0-FINAL.jar
s2-extension-2.4.29.jar
s2-framework-2.4.29.jar
s2openjpa-1.0.0.jar
s2-tiger-2.4.29.jar
serp-1.13.1.jar

修改jdbc.dicon

  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" 
  3.     "http://www.seasar.org/dtd/components24.dtd">
  4. <componentsnamespace="jdbc">
  5. <includepath="jta.dicon"/>
  6. <includepath="jdbc-extension.dicon"/>
  7. <componentclass="org.seasar.extension.jdbc.impl.BasicResultSetFactory"/>
  8. <componentclass="org.seasar.extension.jdbc.impl.ConfigurableStatementFactory">
  9. <arg>
  10. <componentclass="org.seasar.extension.jdbc.impl.BasicStatementFactory"/>
  11. </arg>
  12. <propertyname="fetchSize">100</property>
  13. </component>
  14. <componentname="xaDataSource"
  15. class="org.seasar.extension.dbcp.impl.XADataSourceImpl">
  16. <propertyname="driverClassName">
  17.             "com.mysql.jdbc.Driver"
  18. </property>
  19. <propertyname="URL">
  20.             "jdbc:mysql://localhost:3306/s2openjpa"
  21. </property>
  22. <propertyname="user">"root"</property>
  23. <propertyname="password">"root"</property>
  24. </component>
  25. <componentname="connectionPool"
  26. class="org.seasar.extension.dbcp.impl.ConnectionPoolImpl">
  27. <propertyname="timeout">600</property>
  28. <propertyname="maxPoolSize">10</property>
  29. <propertyname="allowLocalTx">true</property>
  30. <destroyMethodname="close"/>
  31. </component>
  32. <componentname="dataSource"class="org.seasar.extension.dbcp.impl.DataSourceImpl"/>
  33. </components>

jpa.dicon檔案:

  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" 
  3.     "http://www.seasar.org/dtd/components24.dtd">
  4. <componentsinitializeOnCreate="true">
  5. <includepath="s2openjpa.dicon"/>
  6. <componentname="persistenceUnitProvider"class="org.seasar.framework.jpa.impl.ContainerPersistenceUnitProvider">
  7. <propertyname="unitName">"s2openjpaUnit"</property>
  8. <propertyname="providerClassName">"org.apache.openjpa.persistence.PersistenceProviderImpl"</property>
  9. </component>
  10. <componentname="entityManagerFactory"class="javax.persistence.EntityManagerFactory">
  11.         persistenceUnitProvider.entityManagerFactory
  12. </component>
  13. <componentname="entityManager"class="org.seasar.framework.jpa.impl.TxScopedEntityManagerProxy"/>
  14. </components>

persistence.xml:

  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <persistencexmlns="http://java.sun.com/xml/ns/persistence"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
  5.     http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
  6. version="1.0">
  7. <persistence-unitname="s2openjpaUnit"transaction-type="RESOURCE_LOCAL">
  8. <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
  9. <jta-data-source>jdbc/dataSource</jta-data-source>
  10. <class>examples.entity.Department</class>
  11. <class>examples.entity.Employee</class>
  12. <properties>
  13. <propertyname="openjpa.ManagedRuntime"value="org.seasar.openjpa.ee.S2ManagedRuntime"/>
  14. <propertyname="openjpa.jdbc.DBDictionary"value="org.apache.openjpa.jdbc.sql.MySQLDictionary"/>
  15. <propertyname="openjpa.Log"value="DefaultLevel=WARN, Enhance=ERROR, SQL=TRACE"/>
  16. </properties>
  17. </persistence-unit>
  18. </persistence>

修改DepartmentDaoImpl.java

  1. package examples.dao;
  2. import javax.ejb.Stateless;
  3. import javax.persistence.EntityManager;
  4. import javax.persistence.PersistenceContext;
  5. import examples.entity.Department;
  6. @Stateless
  7. publicclass DepartmentDaoImpl implements DepartmentDao {
  8. @PersistenceContext(unitName = "s2openjpaUnit")
  9.     EntityManager em;
  10. public DepartmentDaoImpl() {
  11.     }
  12. public Department getDepartment(int id) {
  13. return em.find(Department.class, id);
  14.     }
  15. }

其他檔案無需修改。

測試程式碼部分:

DepartmentClient.java無需修改。

EntityManagerFactoryClient.java

  1. package examples.work;
  2. import javax.persistence.EntityManager;
  3. import javax.persistence.EntityManagerFactory;
  4. import org.seasar.framework.container.S2Container;
  5. import org.seasar.framework.container.factory.S2ContainerFactory;
  6. import org.seasar.framework.jpa.PersistenceUnitManager;
  7. import examples.entity.Department;
  8. publicclass EntityManagerFactoryClient {
  9. privatestaticfinal String PATH = "app.dicon";
  10. publicstaticvoid main(String[] args) {
  11.         S2Container container = S2ContainerFactory.create(PATH);
  12.         container.init();
  13. try {
  14.             EntityManagerFactory emf = (EntityManagerFactory) container.getComponent(EntityManagerFactory.class);
  15.             EntityManager em = emf.createEntityManager();
  16.             Department department = (Department) em.find(Department.class10);
  17.             System.out.println(department.getDeptno());
  18.             PersistenceUnitManager pum = PersistenceUnitManager.class.cast(container.getComponent(PersistenceUnitManager.class));
  19.             emf = pum.getEntityManagerFactory("s2openjpaUnit");
  20.             em = emf.createEntityManager();
  21.             department = (Department) em.find(Department.class10);
  22.             System.out.println(department.getDeptno());
  23.         } finally {
  24.             container.destroy();
  25.         }
  26.     }
  27. }
EntityManagerClient.java
  1. package examples.work;
  2. import java.util.List;
  3. import javax.ejb.TransactionAttribute;
  4. import javax.ejb.TransactionAttributeType;
  5. import javax.persistence.EntityManager;
  6. import javax.persistence.EntityManagerFactory;
  7. import javax.persistence.EntityTransaction;
  8. import javax.persistence.Query;
  9. import org.seasar.framework.container.S2Container;
  10. import org.seasar.framework.container.factory.S2ContainerFactory;
  11. import examples.entity.Department;
  12. publicclass EntityManagerClient {
  13. privatestaticfinal String PATH = "app.dicon"
  14. publicstaticvoid main(String[] args) {
  15.         S2Container container = S2ContainerFactory.create(PATH);
  16.         container.init();
  17. try {
  18.             EntityManagerFactory emf = (EntityManagerFactory) container.getComponent(EntityManagerFactory.class);
  19.             EntityManager em = emf.createEntityManager();
  20.             Department department = (Department)em.find(Department.class10);
  21.             updateDepartment(em, department);
  22.             Query query =  em.createQuery("select d from Dept d where d.deptno = 10");
  23.             List<?> list = query.getResultList();
  24. for (int i = 0; i < list.size(); i++) {
  25.                 System.out.println(((Department)list.get(i)).getDname());
  26.             }
  27.         } finally {
  28.             container.destroy();
  29.         }
  30.     }
  31. @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
  32. publicstaticvoid updateDepartment(EntityManager em, Department department){
  33.         System.out.println(department.getDname());
  34.         department.setDname(department.getDname() + "XXX");
  35.         EntityTransaction tx = em.getTransaction();
  36.         tx.begin();
  37.         em.persist(department);
  38.         em.flush();
  39.         tx.commit();
  40.     }
  41. }

關於OpenJPA(注意版本,這裡使用1.1版):