官方网页:http://s2toplink.seasar.org/ja/
接上例http://blog.csdn.net/kunshan_shenbin/archive/2008/09/12/2917360.aspx,并作如下修改:
MySql上新建数据库s2toplinkjpa,并执行如下DDL:
- SET FOREIGN_KEY_CHECKS=0;
- -- ----------------------------
- -- Table structure for dept
- -- ----------------------------
- CREATE TABLE `dept` (
- `deptno` int(11) NOT NULL,
- `active` bit(1) NOT NULL,
- `dname` varchar(255) default NULL,
- `loc` varchar(255) default NULL,
- `versionNo` int(11) NOT NULL,
- PRIMARY KEY (`deptno`)
- ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
- -- ----------------------------
- -- Table structure for emp
- -- ----------------------------
- CREATE TABLE `emp` (
- `empno` bigint(20) NOT NULL,
- `city` varchar(255) default NULL,
- `zip` varchar(255) default NULL,
- `comm` float default NULL,
- `ename` varchar(255) default NULL,
- `hiredate` date default NULL,
- `job` varchar(255) default NULL,
- `mgr` smallint(6) default NULL,
- `sal` float default NULL,
- `tstamp` datetime default NULL,
- `deptno` int(11) default NULL,
- PRIMARY KEY (`empno`),
- KEY `FK110A8F5074ABE` (`deptno`),
- CONSTRAINT `FK110A8F5074ABE` FOREIGN KEY (`deptno`) REFERENCES `dept` (`deptno`)
- ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
- -- ----------------------------
- -- Records
- -- ----------------------------
- INSERT INTO `dept` VALUES ('10', '', 'ACCOUNTING', 'NEW YORK', '0');
- INSERT INTO `dept` VALUES ('20', '', 'RESEARCH', 'DALLAS', '0');
- INSERT INTO `dept` VALUES ('30', '', 'SALES', 'CHICAGO', '0');
- INSERT INTO `dept` VALUES ('40', '', 'OPERATIONS', 'BOSTON', '0');
- INSERT INTO `emp` VALUES ('7369', 'LAS VEGAS', '110', null, 'SMITH', '1980-12-17', 'CLERK', '7902', '800', '2000-01-01 00:00:00', '20');
- INSERT INTO `emp` VALUES ('7499', 'MIAMI', '120', '300', 'ALLEN', '1981-02-20', 'SALESMAN', '7698', '1600', '2000-01-01 00:00:00', '30');
- INSERT INTO `emp` VALUES ('7521', 'WASHINGTON', '130', '500', 'WARD', '1981-02-22', 'SALESMAN', '7698', '1250', '2000-01-01 00:00:00', '30');
- INSERT INTO `emp` VALUES ('7566', 'IOWA CITY', '140', null, 'JONES', '1981-04-02', 'MANAGER', '7839', '2975', '2000-01-01 00:00:00', '20');
- INSERT INTO `emp` VALUES ('7654', 'LOS ANGELES', '150', '1400', 'MARTIN', '1981-09-28', 'SALESMAN', '7698', '1250', '2000-01-01 00:00:00', '30');
- INSERT INTO `emp` VALUES ('7698', 'LOS ANGELES', '160', null, 'BLAKE', '1981-05-01', 'MANAGER', '7839', '2850', '2000-01-01 00:00:00', '30');
- INSERT INTO `emp` VALUES ('7782', 'WASHINGTON', '170', null, 'CLARK', '1981-06-09', 'MANAGER', '7839', '2450', '2000-01-01 00:00:00', '10');
- INSERT INTO `emp` VALUES ('7788', 'NEW YORK', '180', null, 'SCOTT', '1982-12-09', 'ANALYST', '7566', '3000', '2005-01-18 13:09:32', '20');
- INSERT INTO `emp` VALUES ('7839', 'SEATTLE', '190', null, 'KING', '1981-11-17', 'PRESIDENT', null, '5000', '2000-01-01 00:00:00', '10');
- INSERT INTO `emp` VALUES ('7844', 'NEW YORK', '210', '0', 'TURNER', '1981-09-08', 'SALESMAN', '7698', '1500', '2000-01-01 00:00:00', '30');
- INSERT INTO `emp` VALUES ('7876', 'SANTA FE', '220', null, 'ADAMS', '1983-01-12', 'CLERK', '7788', '1100', '2000-01-01 00:00:00', '20');
- INSERT INTO `emp` VALUES ('7900', 'NEW YORK', '230', null, 'JAMES', '1981-12-03', 'CLERK', '7698', '950', '2000-01-01 00:00:00', '30');
- INSERT INTO `emp` VALUES ('7902', 'SANTA FE', '240', null, 'FORD', '1981-12-03', 'ANALYST', '7566', '3000', '2000-01-01 00:00:00', '20');
- 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.jarcommons-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
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
- "http://www.seasar.org/dtd/components24.dtd">
- <components namespace="jdbc">
- <include path="jta.dicon"/>
- <include path="jdbc-extension.dicon"/>
- <component class="org.seasar.extension.jdbc.impl.BasicResultSetFactory"/>
- <component class="org.seasar.extension.jdbc.impl.ConfigurableStatementFactory">
- <arg>
- <component class="org.seasar.extension.jdbc.impl.BasicStatementFactory"/>
- </arg>
- <property name="fetchSize">100</property>
- </component>
- <component name="xaDataSource"
- class="org.seasar.extension.dbcp.impl.XADataSourceImpl">
- <property name="driverClassName">
- "com.mysql.jdbc.Driver"
- </property>
- <property name="URL">
- "jdbc:mysql://localhost:3306/s2toplinkjpa"
- </property>
- <property name="user">"root"</property>
- <property name="password">"root"</property>
- </component>
- <component name="connectionPool"
- class="org.seasar.extension.dbcp.impl.ConnectionPoolImpl">
- <property name="timeout">600</property>
- <property name="maxPoolSize">10</property>
- <property name="allowLocalTx">true</property>
- <destroyMethod name="close"/>
- </component>
- <component name="dataSource" class="org.seasar.extension.dbcp.impl.DataSourceImpl"/>
- </components>
jpa.dicon文件:
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
- "http://www.seasar.org/dtd/components24.dtd">
- <components>
- <include path="s2toplink-jpa.dicon"/>
- <component name="persistenceUnitProvider" class="org.seasar.framework.jpa.impl.ContainerPersistenceUnitProvider">
- <property name="unitName">"s2toplinkjpaUnit"</property>
- <property name="providerClassName">"oracle.toplink.essentials.PersistenceProvider"</property>
- </component>
- <component name="entityManagerFactory" class="javax.persistence.EntityManagerFactory">
- persistenceUnitProvider.entityManagerFactory
- </component>
- <component name="entityManager" class="org.seasar.framework.jpa.impl.TxScopedEntityManagerProxy">
- <aspect pointcut="createNamedQuery">
- <component class="org.seasar.toplink.jpa.aop.interceptors.S2TopLinkEntityManagerInterceptor"/>
- </aspect>
- </component>
- </components>
persistence.xml:
- <?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="s2toplinkjpaUnit" transaction-type="RESOURCE_LOCAL">
- <provider>oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider</provider>
- <jta-data-source>jdbc/dataSource</jta-data-source>
- <class>examples.entity.Department</class>
- <class>examples.entity.Employee</class>
- <properties>
- <property name="toplink.target-server" value="org.seasar.toplink.jpa.platform.server.S2ServerPlatform"/>
- <property name="toplink.target-database" value="MySQL4"/>
- <!--
- toplink.target-database:
- Auto(默认)、Attunity、Cloudscape、Database、DB2、DB2Mainframe、DBase、Derby、HSQL、Informix、JavaDB、MySQL4、Oracle、PointBase、PostgreSQL、SQLAnyWhere、SQLServer、Sybase和TimesTen。
- -->
- <property name="toplink.logging.level" value="WARNING"/>
- <property name="toplink.cache.shared.default" value="false"/>
- <!--
- <property name="toplink.ddl-generation" value="create-tables"/>
- <property name="toplink.create-ddl-jdbc-file-name" value="import.sql"/>
- -->
- </properties>
- </persistence-unit>
- </persistence>
修改DepartmentDaoImpl.java
- package examples.dao;
- import javax.ejb.Stateless;
- import javax.persistence.EntityManager;
- import javax.persistence.PersistenceContext;
- import examples.entity.Department;
- @Stateless
- public class DepartmentDaoImpl implements DepartmentDao {
- @PersistenceContext(unitName = "s2toplinkjpaUnit")
- EntityManager em;
- public DepartmentDaoImpl() {
- }
- public Department getDepartment(int id) {
- return em.find(Department.class, id);
- }
- }
其他文件无需修改。
测试代码部分:
DepartmentClient.java无需修改。
EntityManagerFactoryClient.java
- package examples.work;
- import java.util.List;
- import javax.persistence.EntityManager;
- import javax.persistence.EntityManagerFactory;
- import oracle.toplink.essentials.internal.ejb.cmp3.EntityManagerImpl;
- import oracle.toplink.essentials.threetier.ServerSession;
- import org.seasar.framework.container.S2Container;
- import org.seasar.framework.container.factory.S2ContainerFactory;
- import org.seasar.framework.jpa.PersistenceUnitManager;
- import examples.entity.Department;
- public class EntityManagerFactoryClient {
- private static final String PATH = "app.dicon";
- public static void main(String[] args) {
- S2Container container = S2ContainerFactory.create(PATH);
- container.init();
- try {
- EntityManagerFactory emf = (EntityManagerFactory) container.getComponent(EntityManagerFactory.class);
- EntityManager em = emf.createEntityManager();
- Department department = (Department) em.find(Department.class, 10);
- System.out.println(department.getDeptno());
- PersistenceUnitManager pum = PersistenceUnitManager.class.cast(container.getComponent(PersistenceUnitManager.class));
- emf = pum.getEntityManagerFactory("s2toplinkjpaUnit");
- em = emf.createEntityManager();
- EntityManagerImpl entityManagerImpl = EntityManagerImpl.class.cast(em.getDelegate());
- ServerSession session = entityManagerImpl.getServerSession();
- List<?> list = session.readAllObjects(Department.class);
- for (int i = 0; i < list.size(); i++) {
- System.out.println(((Department)list.get(i)).getDname());
- }
- department = (Department) em.find(Department.class, 10);
- System.out.println(department.getDeptno());
- } finally {
- container.destroy();
- }
- }
- }
EntityManagerClient.java
- package examples.work;
- import java.util.List;
- import java.util.Vector;
- import javax.ejb.TransactionAttribute;
- import javax.ejb.TransactionAttributeType;
- import javax.persistence.EntityManager;
- import javax.persistence.EntityManagerFactory;
- import javax.persistence.EntityTransaction;
- import oracle.toplink.essentials.expressions.Expression;
- import oracle.toplink.essentials.expressions.ExpressionBuilder;
- import oracle.toplink.essentials.internal.ejb.cmp3.EntityManagerImpl;
- import oracle.toplink.essentials.queryframework.ReportQuery;
- import oracle.toplink.essentials.queryframework.ReportQueryResult;
- import oracle.toplink.essentials.sessions.DatabaseSession;
- import org.seasar.framework.container.S2Container;
- import org.seasar.framework.container.factory.S2ContainerFactory;
- import examples.entity.Department;
- import examples.entity.Employee;
- public class EntityManagerClient {
- private static final String PATH = "app.dicon";
- public static void main(String[] args) {
- S2Container container = S2ContainerFactory.create(PATH);
- container.init();
- try {
- EntityManagerFactory emf = (EntityManagerFactory) container.getComponent(EntityManagerFactory.class);
- EntityManager em = emf.createEntityManager();
- Department department = (Department)em.find(Department.class, 10);
- updateDepartment(em, department);
- EntityManagerImpl entityManagerImpl = EntityManagerImpl.class.cast(em.getDelegate());
- DatabaseSession session = entityManagerImpl.getServerSession();
- Expression expression = new ExpressionBuilder().get("deptno").equal(20);
- department = (Department)session.readObject(Department.class, expression);
- System.out.println(department.getDname());
- List<?> list = session.readAllObjects(Department.class);
- System.out.println(list.size());
- ExpressionBuilder empBuilder = new ExpressionBuilder();
- ReportQuery subQuery = new ReportQuery(Employee.class, empBuilder);
- subQuery.addMaximum("sal");
- subQuery.setSelectionCriteria(empBuilder.get("department").get("loc").equalsIgnoreCase("CHICAGO"));
- Vector<ReportQueryResult> results = new Vector<ReportQueryResult>();
- results = (Vector)session.executeQuery(subQuery);
- for (int i = 0; i < results.size(); i++) {
- System.out.println(results.get(i).getResults());
- }
- ExpressionBuilder builder = new ExpressionBuilder();
- expression = builder.get("ename").likeIgnoreCase("%la%");
- expression.and(builder.get("sal").between(2000, 3000));
- Vector<Employee> emps = new Vector<Employee>();
- emps = session.readAllObjects(Employee.class, expression);
- for (int i = 0; i < emps.size(); i++) {
- System.out.println(emps.get(i).getEname() + "/t" +emps.get(i).getSal());
- }
- } finally {
- container.destroy();
- }
- }
- @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
- public static void updateDepartment(EntityManager em, Department department){
- System.out.println(department.getDname());
- department.setDname(department.getDname() + "XXX");
- EntityTransaction tx = em.getTransaction();
- tx.begin();
- em.persist(department);
- em.flush();
- tx.commit();
- }
- }
关于toplink:
http://www.javaresearch.org/article/11552.htm
http://www.oracle.com/technology/global/cn/sample_code/tech/java/codesnippet/toplink/index.html