官方主页: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"?>convention.dicon
<!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>
<?xml version="1.0" encoding="UTF-8"?>env_ut.txt
<!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>
ctimport.sql
只要放在classpath下,seasar2会自动执行DML(注意:似乎文件名只能是import.sql)。
INSERT INTO DEPT (DEPTNO,DNAME,LOC,VERSIONNO,ACTIVE) VALUES(10,'ACCOUNTING','NEW YORK',0,1)jdbc.dicon
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')
<?xml version="1.0" encoding="UTF-8"?>jpa.dicon
<!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>
<?xml version="1.0" encoding="UTF-8"?>log4j.properties
<!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, CMETA-INF/persistence.xml
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
<?xml version="1.0" encoding="UTF-8"?>DepartmentDao.dicon
<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=http://tech.ddvip.com/2008-09/"org.hibernate.dialect.MySQL5Dialect"/>
<property name="hibernate.jndi.class" value=http://tech.ddvip.com/2008-09/"org.seasar.extension.j2ee.JndiContextFactory"/>
<property name="hibernate.transaction.manager_lookup_class" value=http://tech.ddvip.com/2008-09/"org.seasar.hibernate.jpa.transaction.SingletonTransactionManagerProxyLookup"/>
<property name="hibernate.show_sql" value=http://tech.ddvip.com/2008-09/"true"/>
<property name="hibernate.format_sql" value=http://tech.ddvip.com/2008-09/"true"/>
<property name="hibernate.use_sql_comments" value=http://tech.ddvip.com/2008-09/"false"/>
<property name="hibernate.archive.autodetection" value=http://tech.ddvip.com/2008-09/""/>
<property name="hibernate.hbm2ddl.auto" value=http://tech.ddvip.com/2008-09/"create"/>
</properties>
</persistence-unit>
</persistence>
<?xml version="1.0" encoding="UTF-8"?>DepartmentDao.java
<!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>
package examples.dao;DepartmentDaoImpl.java
import examples.entity.Department;
public interface DepartmentDao {
Department getDepartment(int id);
}
package examples.dao;Address.java
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);
}
}
package examples.entity;Department.java
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;
}
}
package examples.entity;Employee.java
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();
}
}
package examples.entity;DepartmentClient.java
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();
}
}
package examples.work;EntityManagerClient.java
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();
}
}
}
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();
}
}
}