官方主页:http://s2hibernate.seasar.org/ja/
本例使用MySQL作为数据库,数据库名暂定为s2hb3jpa。
使用的jar包如下。
antlr-2.7.6.jar
aopalliance-1.0.jar
commons-collections-3.1.jar
commons-lang-2.3.jar
commons-logging-1.1.jar
dom4j-1.6.1.jar
ehcache-1.2.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
hibernate3.jar
hibernate-annotations.jar
hibernate-commons-annotations.jar
hibernate-entitymanager.jar
hibernate-search.jar
hibernate-validator.jar
hsqldb-1.8.0.1.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
lucene-core-2.3.0.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
s2hibernate-jpa-1.0.1.jar
s2-tiger-2.4.29.jar
servlet-api.jar
slf4j-api-1.4.2.jar
slf4j-log4j12.jar
代码如下:
app.dicon
- <?xml version="1.0" encoding="Shift_JIS"?>
- <!DOCTYPE components PUBLIC "-//SEASAR2.1//DTD S2Container//EN"
- "http://www.seasar.org/dtd/components21.dtd">
- <components>
- <include path="jdbc.dicon"/>
- <include path="examples/dicon/DepartmentDao.dicon"/>
- </components>
convention.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>
- <component class="org.seasar.framework.convention.impl.NamingConventionImpl" />
- </components>
env_ut.txt
- ct
import.sql
只要放在classpath下,seasar2会自动执行DML(注意:似乎文件名只能是import.sql)。
- INSERT INTO DEPT (DEPTNO,DNAME,LOC,VERSIONNO,ACTIVE) VALUES(10,'ACCOUNTING','NEW YORK',0,1)
- INSERT INTO DEPT (DEPTNO,DNAME,LOC,VERSIONNO,ACTIVE) VALUES(20,'RESEARCH','DALLAS',0,1)
- INSERT INTO DEPT (DEPTNO,DNAME,LOC,VERSIONNO,ACTIVE) VALUES(30,'SALES','CHICAGO',0,1)
- INSERT INTO DEPT (DEPTNO,DNAME,LOC,VERSIONNO,ACTIVE) VALUES(40,'OPERATIONS','BOSTON',0,1)
- INSERT INTO EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO,CITY,ZIP,TSTAMP) VALUES(7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20,'LAS VEGAS','110','2000-01-01 00:00:00.0')
- INSERT INTO EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO,CITY,ZIP,TSTAMP) VALUES(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30,'MIAMI','120','2000-01-01 00:00:00.0')
- INSERT INTO EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO,CITY,ZIP,TSTAMP) VALUES(7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,30,'WASHINGTON','130','2000-01-01 00:00:00.0')
- INSERT INTO EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO,CITY,ZIP,TSTAMP) VALUES(7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,20,'IOWA CITY','140','2000-01-01 00:00:00.0')
- INSERT INTO EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO,CITY,ZIP,TSTAMP) VALUES(7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,30,'LOS ANGELES','150','2000-01-01 00:00:00.0')
- INSERT INTO EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO,CITY,ZIP,TSTAMP) VALUES(7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,NULL,30,'LOS ANGELES','160','2000-01-01 00:00:00.0')
- INSERT INTO EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO,CITY,ZIP,TSTAMP) VALUES(7782,'CLARK','MANAGER',7839,'1981-06-09',2450,NULL,10,'WASHINGTON','170','2000-01-01 00:00:00.0')
- INSERT INTO EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO,CITY,ZIP,TSTAMP) VALUES(7788,'SCOTT','ANALYST',7566,'1982-12-09',3000.0,NULL,20,'NEW YORK','180','2005-01-18 13:09:32.213')
- INSERT INTO EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO,CITY,ZIP,TSTAMP) VALUES(7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10,'SEATTLE','190','2000-01-01 00:00:00.0')
- INSERT INTO EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO,CITY,ZIP,TSTAMP) VALUES(7844,'TURNER','SALESMAN',7698,'1981-09-08',1500,0,30,'NEW YORK','210','2000-01-01 00:00:00.0')
- INSERT INTO EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO,CITY,ZIP,TSTAMP) VALUES(7876,'ADAMS','CLERK',7788,'1983-01-12',1100,NULL,20,'SANTA FE','220','2000-01-01 00:00:00.0')
- INSERT INTO EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO,CITY,ZIP,TSTAMP) VALUES(7900,'JAMES','CLERK',7698,'1981-12-03',950,NULL,30,'NEW YORK','230','2000-01-01 00:00:00.0')
- INSERT INTO EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO,CITY,ZIP,TSTAMP) VALUES(7902,'FORD','ANALYST',7566,'1981-12-03',3000,NULL,20,'SANTA FE','240','2000-01-01 00:00:00.0')
- INSERT INTO EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO,CITY,ZIP,TSTAMP) VALUES(7934,'MILLER','CLERK',7782,'1982-01-23',1300,NULL,10,'IOWA CITY','250','2000-01-01 00:00:00.0')
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/s2hb3jpa"
- </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="s2hibernate-jpa.dicon"/>
- <component name="persistenceUnitProvider" class="org.seasar.framework.jpa.impl.ContainerPersistenceUnitProvider">
- <property name="unitName">"s2hb3jpaUnit"</property>
- </component>
- <component name="entityManagerFactory" class="javax.persistence.EntityManagerFactory">
- persistenceUnitProvider.entityManagerFactory
- </component>
- <component name="entityManager" class="org.seasar.framework.jpa.impl.TxScopedEntityManagerProxy"/>
- </components>
- log4j.category.org.seasar=DEBUG, C
- log4j.additivity.org.seasar=false
- log4j.category.examples=DEBUG, C
- log4j.additivity.examples=false
- log4j.appender.C=org.apache.log4j.ConsoleAppender
- log4j.appender.C.Target=System.out
- log4j.appender.C.ImmediateFlush=true
- log4j.appender.C.layout=org.apache.log4j.PatternLayout
- log4j.appender.C.layout.ConversionPattern=%-5p %d [%t] %m%n
- log4j.rootLogger=INFO, A1
- log4j.appender.A1=org.apache.log4j.ConsoleAppender
- log4j.appender.A1.layout=org.apache.log4j.PatternLayout
- log4j.appender.A1.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
META-INF/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="s2hb3jpaUnit" transaction-type="RESOURCE_LOCAL">
- <provider>org.hibernate.ejb.HibernatePersistence</provider>
- <jta-data-source>jdbc/dataSource</jta-data-source>
- <class>examples.entity.Department</class>
- <class>examples.entity.Employee</class>
- <properties>
- <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>
- <property name="hibernate.jndi.class" value="org.seasar.extension.j2ee.JndiContextFactory"/>
- <property name="hibernate.transaction.manager_lookup_class" value="org.seasar.hibernate.jpa.transaction.SingletonTransactionManagerProxyLookup"/>
- <property name="hibernate.show_sql" value="true"/>
- <property name="hibernate.format_sql" value="true"/>
- <property name="hibernate.use_sql_comments" value="false"/>
- <property name="hibernate.archive.autodetection" value=""/>
- <property name="hibernate.hbm2ddl.auto" value="create"/>
- </properties>
- </persistence-unit>
- </persistence>
DepartmentDao.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="javaee5.dicon"/>
- <include path="jpa.dicon"/>
- <component name="dao" class="examples.dao.DepartmentDaoImpl"/>
- </components>
DepartmentDao.java
- package examples.dao;
- import examples.entity.Department;
- public interface DepartmentDao {
- Department getDepartment(int id);
- }
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 = "s2hb3jpaUnit")
- EntityManager em;
- public DepartmentDaoImpl() {
- }
- public Department getDepartment(int id) {
- return em.find(Department.class, id);
- }
- }
Address.java
- package examples.entity;
- import java.io.Serializable;
- import javax.persistence.Embeddable;
- @Embeddable
- public class Address implements Serializable {
- private static final long serialVersionUID = 1L;
- private String city;
- private String zip;
- public String getCity() {
- return city;
- }
- public void setCity(String city) {
- this.city = city;
- }
- public String getZip() {
- return zip;
- }
- public void setZip(String zip) {
- this.zip = zip;
- }
- }
Department.java
- package examples.entity;
- import java.io.Serializable;
- import java.util.Set;
- import javax.persistence.Entity;
- import javax.persistence.Id;
- import javax.persistence.OneToMany;
- import javax.persistence.Version;
- @Entity(name = "Dept")
- public class Department implements Serializable {
- private static final long serialVersionUID = -1031433105487668130L;
- @Id
- private int deptno;
- private String dname;
- private String loc;
- @SuppressWarnings("unused")
- @Version
- private int versionNo;
- private boolean active;
- @OneToMany(mappedBy = "department")
- private Set<Employee> employees;
- public Department() {
- }
- public int getDeptno() {
- return this.deptno;
- }
- public void setDeptno(int deptno) {
- this.deptno = deptno;
- }
- public java.lang.String getDname() {
- return this.dname;
- }
- public void setDname(java.lang.String dname) {
- this.dname = dname;
- }
- public java.lang.String getLoc() {
- return this.loc;
- }
- public void setLoc(java.lang.String loc) {
- this.loc = loc;
- }
- public void setVersionNo(int versionNo) {
- this.versionNo = versionNo;
- }
- public boolean isActive() {
- return active;
- }
- public void setActive(boolean active) {
- this.active = active;
- }
- public Set<Employee> getEmployees() {
- return employees;
- }
- public void setEmployees(Set<Employee> employees) {
- this.employees = employees;
- }
- @Override
- public boolean equals(Object other) {
- if (!(other instanceof Department))
- return false;
- Department castOther = (Department) other;
- return this.getDeptno() == castOther.getDeptno();
- }
- @Override
- public int hashCode() {
- return this.getDeptno();
- }
- }
Employee.java
- package examples.entity;
- import java.io.Serializable;
- import java.util.Date;
- import javax.persistence.Embedded;
- import javax.persistence.Entity;
- import javax.persistence.Id;
- import javax.persistence.JoinColumn;
- import javax.persistence.ManyToOne;
- import javax.persistence.Temporal;
- import javax.persistence.TemporalType;
- @Entity(name = "Emp")
- public class Employee implements Serializable {
- private static final long serialVersionUID = -5411969211921106291L;
- @Id
- private long empno;
- private String ename;
- private String job;
- private Short mgr;
- @Temporal(TemporalType.DATE)
- private Date hiredate;
- private Float sal;
- private Float comm;
- @Temporal(TemporalType.TIMESTAMP)
- private Date tstamp;
- @ManyToOne
- @JoinColumn(name = "deptno")
- private Department department;
- @Embedded
- private Address address;
- public Employee() {
- }
- public Employee(long empno) {
- this.empno = empno;
- }
- public long getEmpno() {
- return this.empno;
- }
- public void setEmpno(long empno) {
- this.empno = empno;
- }
- public java.lang.String getEname() {
- return this.ename;
- }
- public void setEname(java.lang.String ename) {
- this.ename = ename;
- }
- public java.lang.String getJob() {
- return this.job;
- }
- public void setJob(java.lang.String job) {
- this.job = job;
- }
- public Short getMgr() {
- return this.mgr;
- }
- public void setMgr(Short mgr) {
- this.mgr = mgr;
- }
- public java.util.Date getHiredate() {
- return this.hiredate;
- }
- public void setHiredate(java.util.Date hiredate) {
- this.hiredate = hiredate;
- }
- public Float getSal() {
- return this.sal;
- }
- public void setSal(Float sal) {
- this.sal = sal;
- }
- public Float getComm() {
- return this.comm;
- }
- public void setComm(Float comm) {
- this.comm = comm;
- }
- public Department getDepartment() {
- return this.department;
- }
- public void setDepartment(Department department) {
- this.department = department;
- }
- public Date getTstamp() {
- return this.tstamp;
- }
- public void setTstamp(Date tstamp) {
- this.tstamp = tstamp;
- }
- public Address getAddress() {
- return address;
- }
- public void setAddress(Address address) {
- this.address = address;
- }
- @Override
- public boolean equals(Object other) {
- if (!(other instanceof Employee))
- return false;
- Employee castOther = (Employee) other;
- return this.getEmpno() == castOther.getEmpno();
- }
- @Override
- public int hashCode() {
- return (int) this.getEmpno();
- }
- }
DepartmentClient.java
- package examples.work;
- import org.seasar.framework.container.S2Container;
- import org.seasar.framework.container.factory.S2ContainerFactory;
- import examples.dao.DepartmentDao;
- import examples.dao.DepartmentDaoImpl;
- import examples.entity.Department;
- public class DepartmentClient {
- private static final String PATH = "app.dicon";
- public static void main(String[] args) {
- S2Container container = S2ContainerFactory.create(PATH);
- container.init();
- try {
- DepartmentDao dao = (DepartmentDao)container.getComponent(DepartmentDaoImpl.class);
- Department department = dao.getDepartment(10);
- System.out.println(department.getLoc());
- } finally {
- container.destroy();
- }
- }
- }
EntityManagerClient.java
- package examples.work;
- import javax.ejb.TransactionAttribute;
- import javax.ejb.TransactionAttributeType;
- import javax.persistence.EntityManager;
- import javax.persistence.EntityManagerFactory;
- import javax.persistence.EntityTransaction;
- import org.hibernate.Query;
- import org.hibernate.Session;
- import org.hibernate.SessionFactory;
- import org.seasar.framework.container.S2Container;
- import org.seasar.framework.container.factory.S2ContainerFactory;
- import examples.entity.Department;
- public class EntityManagerClient {
- private static final String PATH = "app.dicon";
- public static void main(String[] args) {
- S2Container container = S2ContainerFactory.create(PATH);
- container.init();
- try {
- //EntityManager em = (EntityManager) container.getComponent(TxScopedEntityManagerProxy.class);
- //Department department = (Department) em.find(Department.class, 10);
- //System.out.println(department.getDname());
- EntityManagerFactory emf = (EntityManagerFactory) container.getComponent(EntityManagerFactory.class);
- EntityManager em = emf.createEntityManager();
- Department department = (Department)em.find(Department.class, 10);
- updateDepartment(em, department);
- final Session session = Session.class.cast(em.getDelegate());
- department = (Department)session.load(Department.class, 10);
- System.out.println(department.getDname());
- Query query = session.createQuery("from Dept");
- System.out.println(query.list().size());
- final SessionFactory sf = session.getSessionFactory();
- System.out.println(sf.getAllClassMetadata().size());
- } 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();
- }
- }
注意:使用注释掉的代码来获得em时,会报告session已经关闭的错误。
EntityManagerFactoryClient.java
- package examples.work;
- import javax.persistence.EntityManager;
- import javax.persistence.EntityManagerFactory;
- import org.hibernate.Session;
- import org.hibernate.SessionFactory;
- 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("s2hb3jpaUnit");
- em = emf.createEntityManager();
- Session session = Session.class.cast(em.getDelegate());
- SessionFactory sf = session.getSessionFactory();
- System.out.println(sf.getAllClassMetadata().size());
- department = (Department) em.find(Department.class, 10);
- System.out.println(department.getDeptno());
- } finally {
- container.destroy();
- }
- }
- }