最近在研究一个关于在不用j2ee容器的远程传递对象到服务器再进行持久化方案,做了一个demo。整个demo基于远程的调用,服务器端使用tomcat,spring整合openjpa2.0(用jpa非xml的实体描述方式进行编程后期更容易维护,推荐)。
客户端是一个简洁的java项目,使用spring的httpinvoker调用服务器中的dao层
实体Employee
@Entity
public class Employee implements Serializable {
private static final long serialVersionUID = 2625622501589847344L;
private Integer empid; //主键
private String username;//用户名
private String password;//密码
getter and setter..... and many persistence annotations....
}
实体Employee对应的Manager接口
public interface EmployeeManager {
public void save(Employee employee);
}
实体Manager接口的实现类
public class EmployeeManagerImpl implements EmployeeManager {
/**
* 保存实体
* @param entity
*/
public void save(Employee employee) {
em.persist(employee);
}
}
服务器端的文件配置EntityMangerFactory的管理和事务管理
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
<property name="persistenceUnitName" value="hotel"/>
</bean>
<!-- 配置使用JPA事务管理器 -->
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
persistence.xml配置
<persistence-unit name="hotel" transaction-type="RESOURCE_LOCAL">
<provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
<class>com.realhotel.core.Employee</class>
<properties>
<property name="openjpa.ConnectionURL" value="jdbc:mysql://localhost:3306/openjpa?useUnicode=true&characterEncoding=UTF-8"/>
<property name="openjpa.ConnectionDriverName" value="org.gjt.mm.mysql.Driver"/>
<property name="openjpa.ConnectionUserName" value="root"/>
<property name="openjpa.ConnectionPassword" value="nui"/>
<property name="openjpa.Log" value="DefaultLevel=WARN, Tool=INFO,SQL=TRACE"/>
<property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(SchemaAction='add')"/>
</properties>
</persistence-unit>
---------------------------------------------------------------服务器端与客户端的分割线--------------------------
客户端调用服务器端的路径配置
<bean id="employeeServiceProxy" class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">
<property name="serviceUrl" value="http://localhost:8080/wepapp/employee.service"/>
<property name="serviceInterface" value="com.realhotel.manager.EmployeeManager"/>
</bean>
经过测试,在服务器端同一个项目中spring可以正常的创建,管理EntityManager,通过dao层也可以正常的CRUD。
通过客户端的调用也是可以传递对象,服务器端可以正常的接受对象,但是服务器端不能创建EntityManager,报空指针错...
对于以上的远程调用,容器环境和持久化的模型,我认为可能原因有:
1、jpa可能受容器的影响,本例使用的是tomcat一个非j2ee应用服务器
2、文件的配置有错误...
3、spring的容器环境有问题,可能需要改写某些类或者是某些jpa的支持机制才能运行(有人使用Hibernate做持久层已经成功)...