Skip to content

Commit 999a8ce

Browse files
committed
Added sample for dynamically adding JTA TX to a bean
1 parent 180e857 commit 999a8ce

File tree

9 files changed

+254
-0
lines changed

9 files changed

+254
-0
lines changed

jpa/dynamic-tx/pom.xml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion>
3+
4+
<parent>
5+
<groupId>org.javaee8</groupId>
6+
<artifactId>jpa</artifactId>
7+
<version>1.0-SNAPSHOT</version>
8+
</parent>
9+
10+
<artifactId>dynamic-tx</artifactId>
11+
<packaging>war</packaging>
12+
<name>Java EE 8 Samples: JPA - Dynamic Transaction</name>
13+
14+
</project>
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package org.javaee8.jpa.dynamic.tx;
2+
3+
import static java.util.stream.Collectors.toSet;
4+
5+
import java.util.logging.Logger;
6+
7+
import javax.annotation.Priority;
8+
import javax.enterprise.context.ApplicationScoped;
9+
import javax.enterprise.inject.Alternative;
10+
import javax.enterprise.inject.Produces;
11+
import javax.enterprise.inject.spi.Bean;
12+
import javax.enterprise.inject.spi.BeanManager;
13+
import javax.enterprise.inject.spi.InterceptionFactory;
14+
import javax.persistence.EntityManager;
15+
import javax.persistence.PersistenceContext;
16+
17+
import org.javaee8.jpa.dynamic.tx.util.EmployeeBeanWrapper;
18+
import org.javaee8.jpa.dynamic.tx.util.TransactionLiteral;
19+
20+
21+
@Alternative
22+
@Priority(500)
23+
@ApplicationScoped
24+
public class ApplicationInit {
25+
26+
private static final Logger logger = Logger.getLogger(ApplicationInit.class.getName());
27+
28+
@Produces @PersistenceContext
29+
private EntityManager entityManager;
30+
31+
@Produces
32+
public EmployeeService produce(InterceptionFactory<EmployeeService> interceptionFactory, BeanManager beanManager) {
33+
34+
logger.info("Producing EmployeeService");
35+
36+
EmployeeService employeeBean =
37+
createRef(
38+
beanManager.resolve(
39+
beanManager.getBeans(EmployeeService.class)
40+
.stream()
41+
.filter(e -> !e.getBeanClass().equals(ApplicationInit.class))
42+
.collect(toSet())), beanManager);
43+
44+
interceptionFactory
45+
.configure()
46+
.filterMethods(am -> am.getJavaMember().getName().equals("persist"))
47+
.forEach(
48+
amc -> amc.add(new TransactionLiteral()));
49+
50+
return interceptionFactory.createInterceptedInstance(
51+
new EmployeeBeanWrapper(employeeBean));
52+
}
53+
54+
EmployeeService createRef(Bean<?> bean, BeanManager beanManager) {
55+
return (EmployeeService)
56+
beanManager.getReference(
57+
bean,
58+
EmployeeService.class,
59+
beanManager.createCreationalContext(bean));
60+
}
61+
62+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package org.javaee8.jpa.dynamic.tx;
2+
3+
import javax.persistence.Entity;
4+
import javax.persistence.GeneratedValue;
5+
import javax.persistence.Id;
6+
7+
@Entity
8+
public class Employee {
9+
10+
@Id
11+
@GeneratedValue
12+
private int id;
13+
14+
private String name;
15+
16+
public int getId() {
17+
return id;
18+
}
19+
20+
public void setId(int id) {
21+
this.id = id;
22+
}
23+
24+
public String getName() {
25+
return name;
26+
}
27+
28+
public void setName(String name) {
29+
this.name = name;
30+
}
31+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package org.javaee8.jpa.dynamic.tx;
2+
3+
import javax.enterprise.context.ApplicationScoped;
4+
import javax.inject.Inject;
5+
import javax.persistence.EntityManager;
6+
7+
@ApplicationScoped
8+
public class EmployeeService {
9+
10+
@Inject
11+
private EntityManager entityManager;
12+
13+
public void persist(Employee employee) {
14+
entityManager.persist(employee);
15+
}
16+
17+
public Employee getById(int id) {
18+
return entityManager.find(Employee.class, id);
19+
}
20+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package org.javaee8.jpa.dynamic.tx.util;
2+
3+
import org.javaee8.jpa.dynamic.tx.Employee;
4+
import org.javaee8.jpa.dynamic.tx.EmployeeService;
5+
6+
public class EmployeeBeanWrapper extends EmployeeService {
7+
8+
private EmployeeService employeeBean;
9+
10+
public EmployeeBeanWrapper() {
11+
}
12+
13+
public EmployeeBeanWrapper(EmployeeService employeeBean) {
14+
this.employeeBean = employeeBean;
15+
}
16+
17+
EmployeeService getWrapped() {
18+
return employeeBean;
19+
}
20+
21+
@Override
22+
public void persist(Employee employee) {
23+
getWrapped().persist(employee);
24+
}
25+
26+
@Override
27+
public Employee getById(int id) {
28+
return getWrapped().getById(id);
29+
}
30+
31+
}
32+
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package org.javaee8.jpa.dynamic.tx.util;
2+
3+
import static javax.transaction.Transactional.TxType.REQUIRED;
4+
5+
import javax.enterprise.util.AnnotationLiteral;
6+
import javax.transaction.Transactional;
7+
8+
@SuppressWarnings("all")
9+
public class TransactionLiteral extends AnnotationLiteral<Transactional> implements Transactional {
10+
11+
private static final long serialVersionUID = 1L;
12+
13+
@Override
14+
public TxType value() {
15+
return REQUIRED;
16+
}
17+
18+
@Override
19+
public Class<?>[] rollbackOn() {
20+
return new Class[0];
21+
}
22+
23+
@Override
24+
public Class<?>[] dontRollbackOn() {
25+
return new Class[0];
26+
}
27+
28+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<persistence version="2.1"
3+
xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
5+
6+
<persistence-unit name="MyPU">
7+
<properties>
8+
<property
9+
name="javax.persistence.schema-generation.database.action"
10+
value="drop-and-create" />
11+
</properties>
12+
</persistence-unit>
13+
14+
</persistence>
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package org.javaee8.jpa.dynamic.tx;
2+
3+
import static org.jboss.shrinkwrap.api.ShrinkWrap.create;
4+
import static org.junit.Assert.assertEquals;
5+
6+
import javax.inject.Inject;
7+
8+
import org.javaee8.jpa.dynamic.tx.ApplicationInit;
9+
import org.javaee8.jpa.dynamic.tx.Employee;
10+
import org.javaee8.jpa.dynamic.tx.EmployeeService;
11+
import org.javaee8.jpa.dynamic.tx.util.EmployeeBeanWrapper;
12+
import org.javaee8.jpa.dynamic.tx.util.TransactionLiteral;
13+
import org.jboss.arquillian.container.test.api.Deployment;
14+
import org.jboss.arquillian.junit.Arquillian;
15+
import org.jboss.shrinkwrap.api.spec.WebArchive;
16+
import org.junit.Test;
17+
import org.junit.runner.RunWith;
18+
19+
20+
@RunWith(Arquillian.class)
21+
public class DynamicTXTest {
22+
23+
@Inject
24+
private EmployeeService employeeService;
25+
26+
@Deployment
27+
public static WebArchive createDeployment() {
28+
return create(WebArchive.class)
29+
.addClasses(
30+
ApplicationInit.class,
31+
Employee.class,
32+
EmployeeBeanWrapper.class,
33+
EmployeeService.class)
34+
.addPackage(
35+
TransactionLiteral.class.getPackage())
36+
.addAsResource(
37+
"META-INF/persistence.xml");
38+
}
39+
40+
@Test
41+
public void testPersist() throws Exception {
42+
Employee employee = new Employee();
43+
employee.setName("reza");
44+
45+
employeeService.persist(employee);
46+
47+
Employee persistedEmployee = employeeService.getById(employee.getId());
48+
49+
assertEquals("reza", persistedEmployee.getName());
50+
}
51+
52+
}

jpa/pom.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
<name>Java EE 8 Samples: JPA</name>
1313

1414
<modules>
15+
<module>dynamic-tx</module>
1516
<module>stream</module>
1617
</modules>
1718

0 commit comments

Comments
 (0)