diff --git a/src/main/java/io/ebean/Transaction.java b/src/main/java/io/ebean/Transaction.java index ef7e45c42..b36e6491c 100644 --- a/src/main/java/io/ebean/Transaction.java +++ b/src/main/java/io/ebean/Transaction.java @@ -5,13 +5,12 @@ import io.ebean.config.DocStoreConfig; import io.ebean.config.ServerConfig; import javax.persistence.PersistenceException; -import java.io.Closeable; import java.sql.Connection; /** * The Transaction object. Typically representing a JDBC or JTA transaction. */ -public interface Transaction extends Closeable { +public interface Transaction extends AutoCloseable { /** * Read Committed transaction isolation. Same as @@ -124,7 +123,13 @@ public interface Transaction extends Closeable { /** * If the transaction is active then perform rollback. Otherwise do nothing. */ - void end() throws PersistenceException; + void end(); + + + /** + * Synonym for end() to support AutoClosable. + */ + void close(); /** * Return true if the transaction is active. diff --git a/src/main/java/io/ebeaninternal/api/ScopedTransaction.java b/src/main/java/io/ebeaninternal/api/ScopedTransaction.java index 7c98280d9..57ec62df0 100644 --- a/src/main/java/io/ebeaninternal/api/ScopedTransaction.java +++ b/src/main/java/io/ebeaninternal/api/ScopedTransaction.java @@ -411,7 +411,7 @@ public class ScopedTransaction implements SpiTransaction { } @Override - public void close() throws IOException { + public void close() { transaction.close(); } } diff --git a/src/main/java/io/ebeaninternal/server/transaction/JdbcTransaction.java b/src/main/java/io/ebeaninternal/server/transaction/JdbcTransaction.java index 9d611ce54..a890a3104 100644 --- a/src/main/java/io/ebeaninternal/server/transaction/JdbcTransaction.java +++ b/src/main/java/io/ebeaninternal/server/transaction/JdbcTransaction.java @@ -1144,11 +1144,7 @@ public class JdbcTransaction implements SpiTransaction { * Alias for end(), which enables this class to be used in try-with-resources. */ @Override - public void close() throws IOException { - try { - end(); - } catch (PersistenceException ex) { - throw new IOException(ex); - } + public void close() { + end(); } } diff --git a/src/test/java/org/tests/model/draftable/Document.java b/src/test/java/org/tests/model/draftable/Document.java index 8daf9c028..ae828293c 100644 --- a/src/test/java/org/tests/model/draftable/Document.java +++ b/src/test/java/org/tests/model/draftable/Document.java @@ -1,5 +1,6 @@ package org.tests.model.draftable; +import io.ebean.Finder; import io.ebean.annotation.DraftOnly; import io.ebean.annotation.Draftable; @@ -15,6 +16,8 @@ import java.util.List; @Entity public class Document extends BaseDomain { + public static DocumentFinder find = new DocumentFinder(); + @Column(unique = true) String title; @@ -72,4 +75,14 @@ public class Document extends BaseDomain { public void setWhenPublish(Timestamp whenPublish) { this.whenPublish = whenPublish; } + + public static class DocumentFinder extends Finder { + DocumentFinder() { + super(Document.class); + } + + public Document asDraft(Long id) { + return query().asDraft().setId(id).findUnique(); + } + } } diff --git a/src/test/java/org/tests/transaction/TestTransactionTryResources.java b/src/test/java/org/tests/transaction/TestTransactionTryResources.java new file mode 100644 index 000000000..f9aa15445 --- /dev/null +++ b/src/test/java/org/tests/transaction/TestTransactionTryResources.java @@ -0,0 +1,71 @@ +package org.tests.transaction; + +import io.ebean.BaseTestCase; +import io.ebean.DuplicateKeyException; +import io.ebean.Ebean; +import io.ebean.Transaction; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.tests.model.draftable.Document; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +public class TestTransactionTryResources extends BaseTestCase { + + private static final Logger log = LoggerFactory.getLogger(TestTransactionTryResources.class); + + @Test + public void tryWithResources_simple() { + + Document doc = new Document(); + + try (Transaction transaction = Ebean.beginTransaction()) { + + doc.setTitle("tryWithResources"); + doc.setBody("stuff"); + doc.save(); + transaction.commit(); + } + + Document document = Document.find.asDraft(doc.getId()); + assertThat(document).isNotNull(); + } + + @Test + public void tryWithResources_catch() { + + try (Transaction transaction = Ebean.beginTransaction()) { + + Document doc = new Document(); + doc.setTitle("tryWithResources_catch"); + doc.setBody("tryWithResources_catch_1"); + doc.save(); + + Document doc2 = new Document(); + doc2.setTitle("tryWithResources_catch"); + doc2.setBody("tryWithResources_catch_2"); + doc2.save(); + + transaction.commit(); + + } catch (DuplicateKeyException e) { + + log.info("catch duplicate ... " + e); + + Document doc3 = new Document(); + doc3.setTitle("tryWithResources_catch"); + doc3.setBody("tryWithResources_catch_3"); + doc3.save(); + + List docs = Document.find.query() + .where().startsWith("body", "tryWithResources_catch") + .asDraft() + .findList(); + + assertThat(docs).hasSize(1); + } + } +}