最近在研究一个关于在不用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做持久层已经成功)...