spring与jpa在tomcat中的远程调用,一种不用j2ee容器的持久方案的尝试与思考

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

 

你可能感兴趣的:(spring,tomcat,bean,应用服务器,jpa)