日系框架之seasar2(S2JPA之TopLink)

官方网页:http://s2toplink.seasar.org/ja/

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

MySql上新建数据库s2toplinkjpa,并执行如下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-logging-1.1.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
poi-3.0-FINAL.jar
s2-extension-2.4.29.jar
s2-framework-2.4.29.jar
s2-tiger-2.4.29.jar
s2toplink-jpa-1.0.1.jar
toplink-essentials-2.0.1-09d.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/s2toplinkjpa"
  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>
  5.     <include path="s2toplink-jpa.dicon"/>
  6.     <component name="persistenceUnitProvider" class="org.seasar.framework.jpa.impl.ContainerPersistenceUnitProvider">
  7.         <property name="unitName">"s2toplinkjpaUnit"</property>
  8.         <property name="providerClassName">"oracle.toplink.essentials.PersistenceProvider"</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.         <aspect pointcut="createNamedQuery">
  15.             <component class="org.seasar.toplink.jpa.aop.interceptors.S2TopLinkEntityManagerInterceptor"/>
  16.         </aspect>
  17.     </component>
  18.     
  19. </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="s2toplinkjpaUnit" transaction-type="RESOURCE_LOCAL">
  8.         <provider>oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider</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="toplink.target-server" value="org.seasar.toplink.jpa.platform.server.S2ServerPlatform"/>
  14.             <property name="toplink.target-database" value="MySQL4"/>
  15.             <!-- 
  16.                 toplink.target-database:
  17.                 Auto(默认)、Attunity、Cloudscape、Database、DB2、DB2Mainframe、DBase、Derby、HSQL、Informix、JavaDB、MySQL4、Oracle、PointBase、PostgreSQL、SQLAnyWhere、SQLServer、Sybase和TimesTen。
  18.              -->
  19.             <property name="toplink.logging.level" value="WARNING"/>
  20.             <property name="toplink.cache.shared.default" value="false"/>
  21.             <!--  
  22.                 <property name="toplink.ddl-generation" value="create-tables"/>
  23.                 <property name="toplink.create-ddl-jdbc-file-name" value="import.sql"/>
  24.             -->
  25.         </properties>
  26.     </persistence-unit>
  27. </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 = "s2toplinkjpaUnit")
  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 java.util.List;
  3. import javax.persistence.EntityManager;
  4. import javax.persistence.EntityManagerFactory;
  5. import oracle.toplink.essentials.internal.ejb.cmp3.EntityManagerImpl;
  6. import oracle.toplink.essentials.threetier.ServerSession;
  7. import org.seasar.framework.container.S2Container;
  8. import org.seasar.framework.container.factory.S2ContainerFactory;
  9. import org.seasar.framework.jpa.PersistenceUnitManager;
  10. import examples.entity.Department;
  11. public class EntityManagerFactoryClient {
  12.     private static final String PATH = "app.dicon";
  13.     public static void main(String[] args) {
  14.         S2Container container = S2ContainerFactory.create(PATH);
  15.         container.init();
  16.         try {
  17.             EntityManagerFactory emf = (EntityManagerFactory) container.getComponent(EntityManagerFactory.class);
  18.             EntityManager em = emf.createEntityManager();
  19.             Department department = (Department) em.find(Department.class10);
  20.             System.out.println(department.getDeptno());
  21.             
  22.             PersistenceUnitManager pum = PersistenceUnitManager.class.cast(container.getComponent(PersistenceUnitManager.class));
  23.             emf = pum.getEntityManagerFactory("s2toplinkjpaUnit");
  24.             em = emf.createEntityManager();
  25.             
  26.             EntityManagerImpl entityManagerImpl = EntityManagerImpl.class.cast(em.getDelegate());
  27.             ServerSession session = entityManagerImpl.getServerSession();
  28.             List<?> list = session.readAllObjects(Department.class);
  29.             for (int i = 0; i < list.size(); i++) {
  30.                 System.out.println(((Department)list.get(i)).getDname());
  31.             }
  32.             
  33.             department = (Department) em.find(Department.class10);
  34.             System.out.println(department.getDeptno());
  35.         } finally {
  36.             container.destroy();
  37.         }
  38.     }
  39. }

EntityManagerClient.java

  1. package examples.work;
  2. import java.util.List;
  3. import java.util.Vector;
  4. import javax.ejb.TransactionAttribute;
  5. import javax.ejb.TransactionAttributeType;
  6. import javax.persistence.EntityManager;
  7. import javax.persistence.EntityManagerFactory;
  8. import javax.persistence.EntityTransaction;
  9. import oracle.toplink.essentials.expressions.Expression;
  10. import oracle.toplink.essentials.expressions.ExpressionBuilder;
  11. import oracle.toplink.essentials.internal.ejb.cmp3.EntityManagerImpl;
  12. import oracle.toplink.essentials.queryframework.ReportQuery;
  13. import oracle.toplink.essentials.queryframework.ReportQueryResult;
  14. import oracle.toplink.essentials.sessions.DatabaseSession;
  15. import org.seasar.framework.container.S2Container;
  16. import org.seasar.framework.container.factory.S2ContainerFactory;
  17. import examples.entity.Department;
  18. import examples.entity.Employee;
  19. public class EntityManagerClient {
  20.     private static final String PATH = "app.dicon"
  21.     
  22.     
  23.     public static void main(String[] args) {
  24.         
  25.         S2Container container = S2ContainerFactory.create(PATH);
  26.         container.init();
  27.         try {
  28.             EntityManagerFactory emf = (EntityManagerFactory) container.getComponent(EntityManagerFactory.class);
  29.             EntityManager em = emf.createEntityManager();
  30.             
  31.             Department department = (Department)em.find(Department.class10);
  32.             updateDepartment(em, department);
  33.             
  34.             EntityManagerImpl entityManagerImpl = EntityManagerImpl.class.cast(em.getDelegate());
  35.             DatabaseSession session = entityManagerImpl.getServerSession();
  36.             Expression expression = new ExpressionBuilder().get("deptno").equal(20);
  37.             department = (Department)session.readObject(Department.class, expression);
  38.             System.out.println(department.getDname());
  39.                 
  40.             List<?> list = session.readAllObjects(Department.class);
  41.             System.out.println(list.size());
  42.             
  43.             ExpressionBuilder empBuilder = new ExpressionBuilder(); 
  44.             ReportQuery subQuery = new ReportQuery(Employee.class, empBuilder);
  45.             subQuery.addMaximum("sal");
  46.             subQuery.setSelectionCriteria(empBuilder.get("department").get("loc").equalsIgnoreCase("CHICAGO"));
  47.             Vector<ReportQueryResult> results = new Vector<ReportQueryResult>();
  48.             results = (Vector)session.executeQuery(subQuery);
  49.             for (int i = 0; i < results.size(); i++) {
  50.                 System.out.println(results.get(i).getResults());
  51.             }
  52.             
  53.             ExpressionBuilder builder = new ExpressionBuilder();    
  54.             expression = builder.get("ename").likeIgnoreCase("%la%");
  55.             expression.and(builder.get("sal").between(20003000));
  56.             Vector<Employee> emps = new Vector<Employee>();   
  57.             emps = session.readAllObjects(Employee.class, expression);
  58.             for (int i = 0; i < emps.size(); i++) {
  59.                 System.out.println(emps.get(i).getEname() + "/t" +emps.get(i).getSal());
  60.             }
  61.         } finally {
  62.             container.destroy();
  63.         }
  64.     }
  65.     
  66.     @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
  67.     public static void updateDepartment(EntityManager em, Department department){
  68.         
  69.         System.out.println(department.getDname());
  70.         department.setDname(department.getDname() + "XXX");
  71.         EntityTransaction tx = em.getTransaction();
  72.         tx.begin();
  73.         em.persist(department);
  74.         em.flush();
  75.         tx.commit();
  76.     }
  77. }

关于toplink:

http://www.javaresearch.org/article/11552.htm

http://www.oracle.com/technology/global/cn/sample_code/tech/java/codesnippet/toplink/index.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值