Ebean ORM是一个使用纯Java实现的开源ORM框架。 Bean使用JPA注释对实体进行映射。Ebean力求让使用最简单的API帮助开发者从数据库获取有用的数据信息。Ebean ORM是轻量级框架,他支持源生sql、分页、大数据查询、批量插入、数据加密、json实用功能。Ebean ORM还支持与spring等框架集成,Ebean orm与spring集成后,ebean事物交给spring全局管理,省去了不少麻烦。但是官方文档对这部分一笔带过,我初次看文档时一头雾水,就是官方demo也过时有点错误,因此我选择了目前比较新版的Ebean ORMspring集成。

示例源码下载

示例项目我已经放到github了,看源码更直观:
https://github.com/ichenkaihua/spring-ebean

开发环境

  • JDK版本:Oracle JDK8
  • IDE: IDEA
  • 构建工具:gradle

添加依赖

本例中使用ebean-orm:6.10.3spring:4.1.7.RELEASE版本
build.gradle文件中配置依赖

apply plugin: 'war'

repositories {
    mavenCentral()
}

dependencies {
    compile 'org.avaje.ebeanorm:avaje-ebeanorm-spring:4.5.3'
    compile 'com.h2database:h2:1.4.189'
    compile "org.springframework:spring-orm:4.1.7.RELEASE"
    compile 'org.springframework:spring-aop:4.1.7.RELEASE'
    testCompile 'org.springframework:spring-test:4.1.7.RELEASE'
    compile 'org.springframework:spring-webmvc:4.1.7.RELEASE'
    compile 'org.aspectj:aspectjweaver:1.8.6'
    compile 'com.fasterxml.jackson.core:jackson-databind:2.6.1'
}

注意:org.avaje.ebeanorm:avaje-ebeanorm-spring:4.5.3依赖ebean ORMebeanorm-spring是ebean提供的spring集成工具。

Spring集成Ebean ORM

spring集成ebean orm,其实就是把ebeaon orm的事物交由spring管理。这里使用xml配置的方式配置spring,spring-config.xml为spring配置文件。
spring-config.xml 文件中,内容如下

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="
        http://www.springframework.org/schema/beans     
        http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-4.2.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop-4.1.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx-4.1.xsd
        ">

	<!-- 扫描注解,除去web层注解,web层注解在mvc配置中扫描 -->
	<context:component-scan
		base-package="com.chenkaihua.springebean.service">
		<context:exclude-filter type="annotation"
			expression="org.springframework.stereotype.Controller" />
		<context:exclude-filter type="annotation"
			expression="org.springframework.web.bind.annotation.RestController" />
	</context:component-scan>

	<!-- 开启AOP监听 只对当前配置文件有效 -->
	<aop:aspectj-autoproxy expose-proxy="true" proxy-target-class="true" />


	<tx:annotation-driven transaction-manager="transactionManager"  />



	<import resource="spring-ebean.xml"/>
</beans>

为了配置更简单查看,我把ebean配置部分独立到spring-ebean.xml文件

spring-ebean.xml文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	   xmlns:tx="http://www.springframework.org/schema/tx"
	   xmlns:aop="http://www.springframework.org/schema/aop"
	   xsi:schemaLocation="
        http://www.springframework.org/schema/beans     
        http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop-4.1.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx-4.1.xsd
        ">

	<bean id="dataSource" class="org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy">
		<constructor-arg>
			<bean class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
				<property name="driverClass" value="org.h2.Driver" />
				<property name="url"
						  value="jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1" />
			</bean>
		</constructor-arg>
	</bean>

	<!--  Transaction Manager -->
	<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource"/>
	</bean>

	<bean id="serverConfig" class="com.avaje.ebean.config.ServerConfig">
		<property name="externalTransactionManager">
			<bean class="com.avaje.ebean.springsupport.txn.SpringAwareJdbcTransactionManager"/>
		</property>
		<property name="defaultServer" value="true"/>

		<property name="namingConvention">
			<bean class="com.avaje.ebean.config.UnderscoreNamingConvention"/>
		</property>
		<property name="name" value="ebeanServer"/>

		<property name="packages">
			<list>
				<value>com.chenkaihua.springebean.entity</value>
			</list>
		</property>

		<property name="dataSource" ref="dataSource"/>
		<!--<property name="disableClasspathSearch" value="true"/>-->
		<!--是否生成sql文件-->
		<property name="ddlGenerate" value="false"/>
		<!--时候启动时读取sql文件,并执行-->
		<property name="ddlRun" value="false"/>
	</bean>

	<!-- Ebean server -->
	<bean id="ebeanServer" class="com.avaje.ebean.springsupport.factory.EbeanServerFactoryBean">
		<property name="serverConfig" ref="serverConfig"/>
	</bean>

	<aop:aspectj-autoproxy  />

	<aop:config>
		<aop:pointcut id="appService"
					  expression="execution(* com.chenkaihua.springebean..*Service*.*(..))" />
		<aop:advisor advice-ref="txAdvice" pointcut-ref="appService" />
	</aop:config>

	<tx:advice id="txAdvice" transaction-manager="transactionManager">
		<tx:attributes>
			<tx:method name="select*" read-only="true" />
			<tx:method name="find*" read-only="true" />
			<tx:method name="get*" read-only="true" />
			<tx:method name="*" />
			<tx:method name="sava*"  />
			<tx:method name="update*" />
			<tx:method name="delete*" />
		</tx:attributes>
	</tx:advice>


</beans>

注意 :配置使用的dataSource类型为org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy,这是一个代理类,spring与ebean-orm集成时必须使用这个类,不然事物不起作用。ebeanServer是ebean-ORM的核心类,也是查询的核心接口。

这样配置之后,就可以在service里注入EbeanServer进行数据库操作了。

怎样使用

ebean项目部署前,必须要enhance,具体操作请参考我的教程:ebean-orm enhance with gradle

@Service
public class UserService {


    @Autowired
    EbeanServer ebeanServer;

    public void save(User user){
        ebeanServer.save(user);
    }

    public void saveOnThrowException(User user){
        ebeanServer.save(user);
        throw new IllegalArgumentException("非法参数!!");
    }


    public List<User> users(){
        return ebeanServer.find(User.class).findList();
    }

}

如果调用saveOnThrowException()方法,抛出异常,事物回滚,说明spring事物起作用了。

参考资料