Compare commits

...
Author SHA1 Message Date
Rob Bygrave 6e340bd149 Bump parent and version 2022-09-05 19:40:21 +12:00
Rob BygraveandGitHub 65f551650f Merge pull request #29 from ebean-orm/feature/bump-flush
Use System.Logger and transaction.flush()
2022-09-05 19:38:30 +12:00
Rob Bygrave 3be3741db6 Change to use System.Logger + transaction.flush() 2022-09-05 19:35:52 +12:00
Rob Bygrave 610afd3717 Update tests 2022-09-05 19:33:40 +12:00
Rob Bygrave 4084822d2c Bump to 13.0.0 and Java 11 2022-03-31 14:38:41 +13:00
Rob Bygrave a2c82263ee Bump to 12.12.0 2021-09-24 11:29:50 +12:00
rbygrave 30f3d542b3 Bump to 12.11.4 2021-09-09 13:10:13 +12:00
rbygrave 56cb2c69aa Bump to 12.11.1 2021-08-16 19:49:02 +12:00
rbygrave bd1dd43cbf Bump to 12.11.0 2021-08-16 19:43:28 +12:00
rob bygrave 5caae29df9 [maven-release-plugin] prepare for next development iteration 2020-12-23 20:46:33 +13:00
rob bygrave 9713b607b5 [maven-release-plugin] prepare release ebean-spring-txn-12.6.4 2020-12-23 20:46:10 +13:00
rob bygrave 0e46558cae Bump ebean to 12.6.4 for #22 2020-12-23 20:45:33 +13:00
Rob BygraveandGitHub 2386f1034b Merge pull request #24 from spinachomes/master
add fail situation for transaction Propagation.REQUIRES_NEW
2020-12-21 16:30:02 +13:00
李清波 ddf9f5c508 add fail situation for transaction Propagation.REQUIRES_NEW 2020-12-21 11:23:00 +08:00
rob bygrave 559867294f Add test for transaction Propagation.REQUIRES_NEW 2020-12-21 14:47:23 +13:00
rob bygrave bf0c8d8dab Add test for transaction Propagation.REQUIRES_NEW 2020-12-21 14:45:13 +13:00
rob bygrave 7077e92cb0 [maven-release-plugin] prepare for next development iteration 2020-12-18 15:29:36 +13:00
rob bygrave 035c5570c3 [maven-release-plugin] prepare release ebean-spring-txn-12.6.3 2020-12-18 15:29:25 +13:00
rob bygrave 0be0fd1e05 Bump to 12.6.3-SNAPSHOT 2020-12-18 15:28:31 +13:00
rob bygrave bdfd380687 #23 - Use updated PostCommit to send ChangeLog changes. Use PreCommit to flush last ChangeLog changes at PreCommit 2020-12-18 14:55:57 +13:00
rob bygrave d1a4c73cd6 [maven-release-plugin] prepare for next development iteration 2020-12-18 10:01:04 +13:00
rob bygrave 7133c81fc5 [maven-release-plugin] prepare release ebean-spring-txn-12.4.2 2020-12-18 10:00:52 +13:00
rob bygrave c6b4de39e8 Merge branch 'master' of github.com:ebean-orm/ebean-spring-txn 2020-12-18 09:58:30 +13:00
rob bygrave 94f367af70 #22 - Spring @Transactional with batch mode not invoking ebean batch flush 2020-12-18 09:58:16 +13:00
Rob BygraveandGitHub dc6c393300 Merge pull request #21 from ebean-orm/dependabot/maven/junit-junit-4.13.1
Bump junit from 4.12 to 4.13.1
2020-10-13 22:55:00 +13:00
dependabot[bot]andGitHub 239f3a0a54 Bump junit from 4.12 to 4.13.1
Bumps [junit](https://github.com/junit-team/junit4) from 4.12 to 4.13.1.
- [Release notes](https://github.com/junit-team/junit4/releases)
- [Changelog](https://github.com/junit-team/junit4/blob/main/doc/ReleaseNotes4.12.md)
- [Commits](https://github.com/junit-team/junit4/compare/r4.12...r4.13.1)

Signed-off-by: dependabot[bot] <support@github.com>
2020-10-13 07:51:29 +00:00
rob bygrave d3e78ab54e [maven-release-plugin] prepare for next development iteration 2020-09-18 01:15:35 +12:00
11 changed files with 161 additions and 106 deletions
+28 -13
View File
@@ -4,13 +4,13 @@
<parent>
<groupId>org.avaje</groupId>
<artifactId>java8-oss</artifactId>
<version>2.2</version>
<artifactId>java11-oss</artifactId>
<version>3.9</version>
</parent>
<groupId>io.ebean</groupId>
<artifactId>ebean-spring-txn</artifactId>
<version>12.4.1</version>
<version>13.9.0</version>
<name>ebean-spring-txn</name>
<packaging>jar</packaging>
@@ -19,30 +19,45 @@
<properties>
<spring.framework.version>4.3.4.RELEASE</spring.framework.version>
<spring.boot.version>1.4.2.RELEASE</spring.boot.version>
<surefire.useModulePath>false</surefire.useModulePath>
</properties>
<url>http://ebean-orm.github.io/</url>
<scm>
<developerConnection>scm:git:git@github.com:ebean-orm/ebean-spring-txn.git</developerConnection>
<tag>ebean-spring-txn-12.4.1</tag>
<tag>HEAD</tag>
</scm>
<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
<version>2.0.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean</artifactId>
<version>12.4.1</version>
<version>13.9.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-ddl-generator</artifactId>
<version>13.9.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.3</version>
<scope>test</scope>
</dependency>
<!-- Provided: Spring, Spring Boot -->
<dependency>
<groupId>org.springframework</groupId>
@@ -81,35 +96,35 @@
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>3.1.0</version>
<version>3.23.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.196</version>
<version>2.1.214</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
<version>1.2.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>[1.7,)</version>
<version>2.0.0</version>
<scope>test</scope>
</dependency>
</dependencies>
@@ -120,11 +135,11 @@
<plugin>
<groupId>io.repaint.maven</groupId>
<artifactId>tiles-maven-plugin</artifactId>
<version>2.17</version>
<version>2.24</version>
<extensions>true</extensions>
<configuration>
<tiles>
<tile>io.ebean.tile:enhancement:12.4.1</tile>
<tile>io.ebean.tile:enhancement:13.9.1</tile>
</tiles>
</configuration>
</plugin>
@@ -1,11 +1,10 @@
package io.ebean.spring.txn;
import io.avaje.applog.AppLog;
import io.ebean.TxScope;
import io.ebean.config.ExternalTransactionManager;
import io.ebeaninternal.api.SpiTransaction;
import io.ebeaninternal.server.transaction.TransactionManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.jdbc.datasource.ConnectionHolder;
import org.springframework.transaction.support.TransactionSynchronization;
import org.springframework.transaction.support.TransactionSynchronizationAdapter;
@@ -15,6 +14,8 @@ import javax.persistence.PersistenceException;
import javax.sql.DataSource;
import java.util.List;
import static java.lang.System.Logger.Level.DEBUG;
/**
* A Spring-aware {@link ExternalTransactionManager}.
* <p>
@@ -26,7 +27,7 @@ import java.util.List;
*/
public class SpringJdbcTransactionManager implements ExternalTransactionManager {
private static final Logger log = LoggerFactory.getLogger(SpringJdbcTransactionManager.class);
private static final System.Logger log = AppLog.getLogger(SpringJdbcTransactionManager.class);
/**
* The data source.
@@ -49,11 +50,10 @@ public class SpringJdbcTransactionManager implements ExternalTransactionManager
*/
@Override
public void setTransactionManager(Object txnMgr) {
// RB: At this stage not exposing TransactionManager to
// the public API and hence the Object type and casting here
this.transactionManager = (TransactionManager) txnMgr;
this.dataSource = transactionManager.getDataSource();
this.dataSource = transactionManager.dataSource();
}
/**
@@ -64,13 +64,11 @@ public class SpringJdbcTransactionManager implements ExternalTransactionManager
*/
@Override
public Object getCurrentTransaction() {
// Get the current Spring ConnectionHolder associated to the current spring managed transaction
ConnectionHolder holder = (ConnectionHolder) TransactionSynchronizationManager.getResource(dataSource);
if (holder == null || !holder.isSynchronizedWithTransaction()) {
// no current Spring transaction
SpiTransaction currentEbeanTransaction = transactionManager.getInScope();
SpiTransaction currentEbeanTransaction = transactionManager.inScope();
if (currentEbeanTransaction == null || !currentEbeanTransaction.isActive()) {
return null;
} else {
@@ -90,7 +88,6 @@ public class SpringJdbcTransactionManager implements ExternalTransactionManager
// Create and register a Spring TransactionSynchronization for this transaction
springTxnLister = createSpringTxnListener(newTrans);
TransactionSynchronizationManager.registerSynchronization(springTxnLister);
return transactionManager.externalBeginTransaction(newTrans, TxScope.required());
}
}
@@ -102,7 +99,6 @@ public class SpringJdbcTransactionManager implements ExternalTransactionManager
* </p>
*/
private SpringTxnListener getSpringTxnListener() {
if (TransactionSynchronizationManager.isSynchronizationActive()) {
List<TransactionSynchronization> synchronizations = TransactionSynchronizationManager.getSynchronizations();
if (synchronizations != null) {
@@ -114,7 +110,6 @@ public class SpringJdbcTransactionManager implements ExternalTransactionManager
}
}
}
return null;
}
@@ -159,27 +154,27 @@ public class SpringJdbcTransactionManager implements ExternalTransactionManager
@Override
public void flush() {
transaction.flushBatch();
transaction.flush();
}
@Override
public void beforeCommit(boolean readOnly) {
// Future note: for JPA2 locking we will
// have beforeCommit events to fire
if (!readOnly) {
transaction.preCommit();
}
}
@Override
public void afterCompletion(int status) {
switch (status) {
case STATUS_COMMITTED:
log.debug("Spring Txn [{}] committed", transaction.getId());
transactionManager.notifyOfCommit(transaction);
log.log(DEBUG, "Spring Txn [{0}] committed", transaction.getId());
transaction.postCommit();
break;
case STATUS_ROLLED_BACK:
log.debug("Spring Txn [{}] rollback", transaction.getId());
transactionManager.notifyOfRollback(transaction, null);
log.log(DEBUG, "Spring Txn [{0}] rollback", transaction.getId());
transaction.postRollback(null);
break;
default:
+9
View File
@@ -0,0 +1,9 @@
module io.ebean.spring.txn {
exports io.ebean.spring.txn;
requires io.ebean.api;
requires io.ebean.core;
requires spring.jdbc;
requires spring.tx;
}
+2
View File
@@ -3,7 +3,9 @@ package org.example;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.Table;
@Table(name="o_account")
@Entity
public class Account {
@@ -1,29 +1,29 @@
package org.example;
import io.ebean.Database;
import io.ebean.DatabaseFactory;
import io.ebean.annotation.PersistBatch;
import io.ebean.config.DatabaseConfig;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.InitializingBean;
import io.ebean.EbeanServer;
import io.ebean.EbeanServerFactory;
import io.ebean.config.ServerConfig;
/**
* A Spring FactoryBean for constructing EbeanServer instances.
*
* @since 18.05.2009
* @author E Mc Greal
*/
public class EbeanServerFactoryBean implements InitializingBean, FactoryBean<EbeanServer> {
public class EbeanServerFactoryBean implements InitializingBean, FactoryBean<Database> {
/**
* The Ebean server configuration.
*/
private ServerConfig serverConfig;
private DatabaseConfig serverConfig;
/**
* The EbeanServer instance.
*/
private EbeanServer ebeanServer;
private Database ebeanServer;
public void afterPropertiesSet() throws Exception {
@@ -31,16 +31,17 @@ public class EbeanServerFactoryBean implements InitializingBean, FactoryBean<Ebe
throw new Exception("No ServerConig set. You must define a ServerConfig bean");
}
serverConfig.setPersistBatch(PersistBatch.ALL);
// Create the new EbeanServer using the configuration
this.ebeanServer = EbeanServerFactory.create(serverConfig);
this.ebeanServer = DatabaseFactory.create(serverConfig);
}
public EbeanServer getObject() throws Exception {
public Database getObject() throws Exception {
return ebeanServer;
}
public Class<? extends EbeanServer> getObjectType() {
return EbeanServer.class;
public Class<? extends Database> getObjectType() {
return Database.class;
}
/**
@@ -53,14 +54,14 @@ public class EbeanServerFactoryBean implements InitializingBean, FactoryBean<Ebe
/**
* Return the server configuration.
*/
public ServerConfig getServerConfig() {
public DatabaseConfig getServerConfig() {
return serverConfig;
}
/**
* Set the server configuration.
*/
public void setServerConfig(ServerConfig serverConfig) {
public void setServerConfig(DatabaseConfig serverConfig) {
this.serverConfig = serverConfig;
}
}
@@ -1,6 +1,6 @@
package org.example;
import io.ebean.Ebean;
import io.ebean.DB;
import io.ebean.Transaction;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -10,6 +10,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
@@ -42,12 +43,12 @@ public class EbeanSpringModuleTest {
@Test
public void testInactiveTransaction() {
Transaction transaction = Ebean.beginTransaction();
Transaction transaction = DB.beginTransaction();
long id;
try {
User user = new User();
user.setName("save with txn 1");
Ebean.save(user);
DB.save(user);
transaction.commit();
id = user.getOid();
} finally {
@@ -55,15 +56,19 @@ public class EbeanSpringModuleTest {
//transaction.end();
}
Ebean.delete(User.class, id);
DB.delete(User.class, id);
}
@Test
public void testBatchInsert() {
userService.batchInsert();
}
@Test
public void testRequiresNew() {
userService.requiresNew();
}
/**
* Test app.
*/
@@ -74,6 +79,10 @@ public class EbeanSpringModuleTest {
user.setName("ebean");
userService.save(user);
logger.info("Saved new User");
assertThat(user.getOid()).isGreaterThan(0);
final User found = DB.find(User.class, user.getOid());
assertThat(found).isNotNull();
}
/**
+2
View File
@@ -4,7 +4,9 @@ import java.util.Set;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
@Table(name="o_role")
@Entity
public class Role {
+5 -5
View File
@@ -1,13 +1,13 @@
package org.example;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.OneToOne;
import io.ebean.Model;
import javax.persistence.*;
import java.util.Set;
@Table(name="o_user")
@Entity
public class User {
public class User extends Model {
@Id
long oid;
@@ -14,4 +14,6 @@ public interface UserService {
void nonTransactional();
void batchInsert();
void requiresNew();
}
+70 -50
View File
@@ -1,78 +1,98 @@
package org.example;
import io.ebean.Database;
import io.ebean.Transaction;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import io.ebean.EbeanServer;
import java.util.ArrayList;
import java.util.List;
/**
* The Class UserServiceImpl.
*
* @since 18.05.2009
* @author E Mc Greal
* @since 18.05.2009
*/
public class UserServiceImpl implements UserService {
public class UserServiceImpl implements UserService, ApplicationContextAware {
/** The ebean server. */
@Autowired
private EbeanServer ebeanServer;
private ApplicationContext applicationContext;
@Transactional(propagation = Propagation.REQUIRED, rollbackFor=Throwable.class)
public void save(User user) {
ebeanServer.save(user);
}
/**
* The ebean server.
*/
@Autowired
private Database ebeanServer;
@Transactional(readOnly = true, propagation = Propagation.REQUIRED)
public User find(long id) {
return ebeanServer.find(User.class, id);
}
public void nonTransactional() {
ebeanServer.currentTransaction();
}
public User findNoCurrentTransaction(long id) {
return ebeanServer.find(User.class, id);
}
@Transactional(propagation = Propagation.REQUIRED)
public void batchInsert() {
List<User> users = new ArrayList<>();
for(int i=0 ;i<25;i++){
User user = new User();
user.setName("user"+i);
users.add(user);
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Throwable.class)
public void save(User user) {
ebeanServer.save(user);
}
System.out.println("---------before batch-------");
@Transactional(readOnly = true, propagation = Propagation.REQUIRED)
public User find(long id) {
return ebeanServer.find(User.class, id);
}
Transaction tx = ebeanServer.currentTransaction();
tx.setBatchSize(20);
ebeanServer.saveAll(users);
public void nonTransactional() {
ebeanServer.currentTransaction();
}
System.out.println("---------after batch-------");
}
public User findNoCurrentTransaction(long id) {
return ebeanServer.find(User.class, id);
}
@Transactional(propagation = Propagation.REQUIRED)
public void batchInsert() {
List<User> users = new ArrayList<>();
for (int i = 0; i < 25; i++) {
User user = new User();
user.setName("user" + i);
users.add(user);
}
System.out.println("---------before batch-------");
Transaction tx = ebeanServer.currentTransaction();
tx.setBatchSize(20);
ebeanServer.saveAll(users);
System.out.println("---------after batch-------");
applicationContext.getBean(UserService.class).requiresNew();
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void requiresNew() {
User user = new User();
user.setName("user_x0");
user.insert();
//ebeanServer.save(user);
}
/**
* Return the ebean server.
*/
public EbeanServer getEbeanServer() {
return ebeanServer;
}
/**
* Return the ebean server.
*/
public Database getEbeanServer() {
return ebeanServer;
}
/**
* Sets the ebean server.
*/
public void setEbeanServer(EbeanServer ebeanServer) {
this.ebeanServer = ebeanServer;
}
/**
* Sets the ebean server.
*/
public void setEbeanServer(Database ebeanServer) {
this.ebeanServer = ebeanServer;
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
}
+1 -1
View File
@@ -4,7 +4,7 @@
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd">
<!-- Default abstract Ebean Server configuration -->
<bean id="defaultEbeanServerConfig" class="io.ebean.config.ServerConfig" abstract="true">
<bean id="defaultEbeanServerConfig" class="io.ebean.config.DatabaseConfig" abstract="true">
<property name="externalTransactionManager">
<bean class="io.ebean.spring.txn.SpringJdbcTransactionManager"/>
</property>