# spring-data-ebean
**Repository Path**: shenghaiyan/spring-data-ebean
## Basic Information
- **Project Name**: spring-data-ebean
- **Description**: 基于Ebean的Spring data领域仓储接口实现,实现DDD必备瑞士军刀,超越JPA、Hibernate、Mybatis.
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 29
- **Created**: 2017-07-01
- **Last Updated**: 2021-11-03
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# spring-data-ebean
> Ebean implementation for spring data.
[](https://travis-ci.org/hexagonframework/spring-data-ebean) [](https://gitter.im/hexagonframework/spring-data-ebean)
[](https://maven-badges.herokuapp.com/maven-central/io.github.hexagonframework.data/spring-data-ebean)
[Maven cental link](http://search.maven.org/#search%7Cga%7C1%7Cg%3A%22io.github.hexagonframework.data%22%20AND%20a%3A%22spring-data-ebean%22 "maven central spring-data-ebean")
[简体中文](README_zh.md)
The primary goal of the [Spring Data](http://projects.spring.io/spring-data) project is to make it easier to build Spring-powered applications that use data access technologies. This module deals with enhanced support for [Ebean ORM](https://ebean-orm.github.io) based data access layers.
## Features ##
* Ebean implementation of CRUD methods for JPA Entities
* Dynamic query generation from query method names and annotation
* Transparent triggering of Ebean Query by query methods
* Implementation domain base classes providing basic properties
* Support for transparent auditing (created, last changed)
* Possibility to integrate custom repository code
* Easy Spring integration with custom namespace
## Why choose [Ebean ORM](https://ebean-orm.github.io)
[see](http://ebean-orm.github.io/architecture/compare-jpa)
## Quick Start ##
Download the jar through Maven:
```xml
io.github.hexagonframework.data
spring-data-ebean
{current version}
```
The simple Spring Data Ebean configuration with Java-Config looks like this:
```java
@Configuration
@EnableEbeanRepositories("org.springframework.data.ebean.repository.sample")
@EnableTransactionManagement
public class SampleConfig {
@Bean
public DataSource dataSource() {
return new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2).build();
}
@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@SuppressWarnings("SpringJavaAutowiringInspection")
@Bean
@Primary
public ServerConfig defaultEbeanServerConfig() {
ServerConfig config = new ServerConfig();
config.setDataSource(dataSource());
config.addPackage("org.springframework.data.ebean.domain.sample");
config.setExternalTransactionManager(new SpringJdbcTransactionManager());
config.loadFromProperties();
config.setDefaultServer(true);
config.setRegister(true);
config.setAutoCommitMode(false);
config.setExpressionNativeIlike(true);
return config;
}
@Bean
@Primary
public EbeanServer defaultEbeanServer(ServerConfig defaultEbeanServerConfig) {
return EbeanServerFactory.create(defaultEbeanServerConfig);
}
}
```
Create an entity:
```java
@Entity
public class User {
@Id
@GeneratedValue
private Integer id;
private String firstname;
private String lastname;
@Column(nullable = false, unique = true) private String emailAddress;
// Getters and setters
// (Firstname, Lastname,emailAddress)-constructor and noargs-constructor
// equals / hashcode
}
```
Create a repository interface in `org.springframework.data.ebean.repository.sample`:
```java
public interface UserRepository extends EbeanRepository {
@Query("where emailAddress = :emailAddress order by id desc")
User findUserByEmailAddressEqualsOql(@Param("emailAddress") String emailAddress);
@Query("select (firstname,lastname,address) fetch manager (lastname) where lastname = :lastname order by id desc")
List findByLastnameOql(@Param("lastname") String lastname);
@Query(nativeQuery = true, value = "select * from user where email_address = :emailAddress order by id desc")
User findUserByEmailAddressEquals(@Param("emailAddress") String emailAddress);
@Query(nativeQuery = true, value = "select * from user where lastname = :lastname order by id desc")
List findUsersByLastnameEquals(@Param("lastname") String lastname);
@Query(nativeQuery = true, value = "update user set email_address = :newEmail where email_address = :oldEmail")
@Modifying
int changeUserEmailAddress(@Param("oldEmail") String oldEmail, @Param("newEmail") String newEmail);
@Query("delete from user where emailAddress = :emailAddress")
@Modifying
int deleteUserByEmailAddressOql(@Param("emailAddress") String emailAddress);
@Query(nativeQuery = true, value = "delete from user where email_address = :emailAddress")
@Modifying
int deleteUserByEmailAddress(@Param("emailAddress") String emailAddress);
@Query(name = "withManagerById")
List findByLastnameNamedOql(@Param("lastname") String lastname);
List findAllByEmailAddressAndLastname(@Param("emailAddress") String emailAddress, @Param("lastname") String lastname);
}
```
Create a named query config in `resources/ebean.xml`:
```xml
select (firstname,lastname,address)
fetch manager (lastname)
where lastname = :lastname order by id desc
select * from user
where email_address = :emailAddress
order by id desc
```
Write a test client:
```java
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SampleConfig.class)
public class UserRepositoryIntegrationTest {
@Autowired
UserRepository repository;
@Test
public void sampleTestCase() {
User user = new User("Xuegui", "Yuan", "yuanxuegui@163.com");
user.setAge(29);
user = repository.save(user);
List result1 = (List) repository.findAll();
result1.forEach(it -> System.out.println(it));
assertEquals(1, result1.size());
assertEquals("Yuan", result1.get(0).getLastname());
assertThat(result1, hasItem(user));
List result2 = repository.findByLastnameOql("Yuan");
assertEquals(1, result2.size());
assertEquals("Yuan", result2.get(0).getLastname());
assertThat(result2, hasItem(user));
List result3 = repository.findUsersByLastnameEquals("Yuan");
assertEquals(1, result3.size());
assertEquals("Yuan", result3.get(0).getLastname());
User result4 = repository.findUserByEmailAddressEqualsOql("yuanxuegui@163.com");
assertEquals("yuanxuegui@163.com", result4.getEmailAddress());
User result5 = repository.findUserByEmailAddressEquals("yuanxuegui@163.com");
assertEquals("yuanxuegui@163.com", result5.getEmailAddress());
int result6 = repository.changeUserEmailAddress("yuanxuegui@163.com", "yuanxuegui@126.com");
assertEquals(1, result6);
List result7 = repository.findByLastnameOql("Yuan");
assertEquals("yuanxuegui@126.com", result7.get(0).getEmailAddress());
int result8 = repository.deleteUserByEmailAddress("yuanxuegui@126.com");
assertEquals(1, result8);
User result9 = repository.findUserByEmailAddressEquals("yuanxuegui@126.com");
assertNull(result9);
user = new User("Xuegui", "Yuan", "yuanxuegui@163.com");
user.setAge(29);
user = repository.save(user);
User result10 = repository.findUserByEmailAddressEquals("yuanxuegui@163.com");
assertNotNull(result10);
int result11 = repository.deleteUserByEmailAddressOql("yuanxuegui@163.com");
assertEquals(1, result11);
User result12 = repository.findUserByEmailAddressEquals("yuanxuegui@163.com");
assertNull(result12);
}
@Test
public void testFindByExample() {
User u = new User();
u.setEmailAddress("YUANXUEGUI");
List result1 = repository.findAll(Example.of(u, ExampleMatcher.matchingAll()
.withIgnoreCase(true)
.withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING)));
assertEquals(1, result1.size());
assertEquals("Yuan", result1.get(0).getLastname());
assertThat(result1, hasItem(user));
List result2 = repository.findAll(Example.of(u, ExampleMatcher.matchingAll()
.withIgnoreCase(false)
.withStringMatcher(ExampleMatcher.StringMatcher.EXACT)));
assertEquals(0, result2.size());
}
}
```