日系框架之seasar2(S2JPA之OpenJPA)

来源:互联网 发布:js事件对象event 编辑:程序博客网 时间:2024/04/28 22:23

官方主页:http://s2openjpa.seasar.org/ja/

接上例http://blog.csdn.net/kunshan_shenbin/archive/2008/09/12/2917360.aspx,并作如下修改:

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

jpa.dicon文件:

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

persistence.xml:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <persistence xmlns="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-unit name="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.             <property name="openjpa.ManagedRuntime" value="org.seasar.openjpa.ee.S2ManagedRuntime"/>
  14.             <property name="openjpa.jdbc.DBDictionary" value="org.apache.openjpa.jdbc.sql.MySQLDictionary"/>
  15.             <property name="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. public class DepartmentDaoImpl implements DepartmentDao {
  8.     @PersistenceContext(unitName = "s2openjpaUnit")
  9.     EntityManager em;
  10.     public DepartmentDaoImpl() {
  11.     }
  12.     public Department getDepartment(int id) {
  13.         
  14.         return em.find(Department.class, id);
  15.     }
  16. }

其他文件无需修改。

测试代码部分:

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. public class EntityManagerFactoryClient {
  9.     private static final String PATH = "app.dicon";
  10.     public static void 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.             
  19.             PersistenceUnitManager pum = PersistenceUnitManager.class.cast(container.getComponent(PersistenceUnitManager.class));
  20.             emf = pum.getEntityManagerFactory("s2openjpaUnit");
  21.             em = emf.createEntityManager();
  22.             
  23.             department = (Department) em.find(Department.class10);
  24.             System.out.println(department.getDeptno());
  25.         } finally {
  26.             container.destroy();
  27.         }
  28.     }
  29. }
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. public class EntityManagerClient {
  13.     private static final String PATH = "app.dicon"
  14.     
  15.     
  16.     public static void main(String[] args) {
  17.         
  18.         S2Container container = S2ContainerFactory.create(PATH);
  19.         container.init();
  20.         try {
  21.             EntityManagerFactory emf = (EntityManagerFactory) container.getComponent(EntityManagerFactory.class);
  22.             EntityManager em = emf.createEntityManager();
  23.             
  24.             Department department = (Department)em.find(Department.class10);
  25.             updateDepartment(em, department);
  26.             
  27.             Query query =  em.createQuery("select d from Dept d where d.deptno = 10");
  28.             List<?> list = query.getResultList();
  29.             for (int i = 0; i < list.size(); i++) {
  30.                 System.out.println(((Department)list.get(i)).getDname());
  31.             }
  32.         } finally {
  33.             container.destroy();
  34.         }
  35.     }
  36.     
  37.     @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
  38.     public static void updateDepartment(EntityManager em, Department department){
  39.         
  40.         System.out.println(department.getDname());
  41.         department.setDname(department.getDname() + "XXX");
  42.         EntityTransaction tx = em.getTransaction();
  43.         tx.begin();
  44.         em.persist(department);
  45.         em.flush();
  46.         tx.commit();
  47.     }
  48. }

关于OpenJPA(注意版本,这里使用1.1版):

http://openjpa.apache.org/builds/1.1.0/apache-openjpa-1.1.0/docs/manual/manual.html

原创粉丝点击