Я пытаюсь использовать Narayana JTA (автономный) для интеграционных тестов с использованием jar-файлов Spring 6, Hibernate 6 и Narayana 7. Существует два источника данных XA для двух разных баз данных Oracle.
У меня есть интеграционный тест, который вызывает метод службы, который пытается создать объекты с использованием двух репозиториев в этих двух базах данных.
Транзакция отмечена вокруг этого метода службы. . Итак, если есть какая-то ошибка базы данных, например. «Нарушено ограничение уникального ключа» в одной из двух баз данных; тогда всю транзакцию следует откатить. Это означает, что если при создании одного объекта произошла ошибка, то другой объект в другой базе данных создаваться не должен. Но в моем случае этого не происходит; другой объект сохраняется в другой базе данных. Я уверен, что в конфигурации чего-то не хватает, но не могу это найти. Может ли кто-нибудь помочь?
Вот моя конфигурация:
spring-context.xml
org.hibernate.dialect.OracleDialect
true
true
100
jta
org.hibernate.engine.transaction.jta.platform.internal.JBossStandAloneJtaPlatform
DELAYED_ACQUISITION_AND_RELEASE_AFTER_STATEMENT
Вот Java-код:
Сущность в первой базе данных
@Entity
@Table(name="Employee")
public class Employee implements Serializable
{
private static final long serialVersionUID = 5836022075789949386L;
@Id
//@GeneratedValue(generator = "ADD_ID", strategy = GenerationType.SEQUENCE)
//@SequenceGenerator(name = "ADD_ID", sequenceName = "orclseq",allocationSize=1)
@Column(name="ID", unique=true, nullable=false, precision=10, scale=0)
private long id=1;
@Column(name="FIRST_NAME", length=255, nullable=true, unique=false, insertable = true, updatable = true)
private String firstName;
@Column(name="LAST_NAME", length=255, nullable=true, unique=false, insertable = true, updatable = true)
private String lastName;
@Column(name="SALARY", nullable=true, unique=false, insertable = true, updatable = true)
private long salary;
// ...
}
Объект во второй базе данных
@Entity
@Table(name="Department")
public class Department implements Serializable
{
private static final long serialVersionUID = 139133657785770125L;
@Id
@GeneratedValue(generator = "id_seq", strategy = GenerationType.SEQUENCE)
@SequenceGenerator(name = "id_seq", sequenceName = "id_seq",allocationSize=1)
private long id=1;
@Column(name="name", length=100, nullable=true, unique=false, insertable = true, updatable = true)
private String name;
@Column(name="location", length=100, nullable=true, unique=false, insertable = true, updatable = true)
private String location;
// ...
}
DAO/репозитории
EmployeeDAO
public class EmployeeDAOImpl extends ParentDAOHibernateImpl implements EmployeeDAO
{
@Override
public Employee createEmployee(Employee e)
{
firstDS_SessionFactory.getCurrentSession().persist(e);
return e;
}
// ...
}
ОтделDAO
public class DepartmentDAOImpl extends ParentDAOHibernateImpl implements DepartmentDAO
{
@Override
public Department createDepartment(Department d)
{
secondDS_SessionFactory.getCurrentSession().persist(d);
return d;
}
// ...
}
Сервис
public class EmployeeServiceImpl implements EmployeeService
{
EmployeeDAO employeeDAO;
DepartmentDAO departmentDAO;
// getter, setters
@Override
@Transactional
public Map createEmployeeAndDepartment(Employee e, Department d) throws Exception
{
Map map = new HashMap(2);
Employee e1 = employeeDAO.createEmployee(e);
Department d1 = departmentDAO.createDepartment(d);
map.put("Employee", e1.getId());
map.put("Department", d1.getId());
return map;
}
}
Весенний тест
@ExtendWith(SpringExtension.class)
@ContextConfiguration(
locations = { "classpath*:/spring-context.xml"})
public class EmployeeServiceTest
{
@Autowired
EmployeeService employeeService;
@Autowired
DepartmentService departmentService;
@Test
void test_createEntities() throws Exception
{
Map idMap = null;
idMap = employeeService.createEmployeeAndDepartment(new Employee("test firstname", "test lastname", 100000), new Department("new", "pune"));
// should throw exception and department entity should not be saved in database as there is exception while creating Employee entity.
System.out.println(idMap);
}
}
зависимости Gradle:
dependencies {
api "org.hibernate:hibernate-core:6.5.2.Final"
api "org.springframework:spring-context:6.1.13"
api "org.springframework:spring-context-support:6.1.13"
api "org.springframework:spring-jdbc:6.1.13"
api "org.springframework:spring-jms:6.1.13"
api "org.springframework:spring-orm:6.1.13"
api "org.springframework:spring-test:6.1.13"
api "org.aspectj:aspectjweaver:1.9.4"
api "ch.qos.logback:logback-classic:1.5.3"
api "org.junit.jupiter:junit-jupiter:5.10.1"
api "org.mockito:mockito-core:5.10.0"
api "com.oracle.database.jdbc:ojdbc8:19.19.0.0"
api ('org.jboss:jboss-common-core:2.2.22.GA'){
exclude module: 'jboss-logging-spi'
}
integrationTestImplementation "org.jboss.narayana.jta:narayana-jta:7.0.2.Final"
integrationTestImplementation 'com.atomikos:transactions-jta:6.0.0:jakarta'
integrationTestImplementation "com.atomikos:transactions-hibernate4:6.0.0:jakarta"
integrationTestImplementation sourceSets.main.output
integrationTestImplementation sourceSets.test.output
}
Подробнее здесь: https://stackoverflow.com/questions/792 ... ibernate-6
Автономный JTA с Narayana 7, Spring 6 и Hibernate 6. ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Автономный JTA с Narayana 7, Spring 6 и Hibernate 6 – вся транзакция не откатывается
Anonymous » » в форуме JAVA - 0 Ответы
- 16 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Использует ли hibernate внутренний jdbc или внутренний JTA, или его можно настроить?
Anonymous » » в форуме JAVA - 0 Ответы
- 48 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Не удалось установить тайм-аут по умолчанию для менеджера транзакций JTA.
Anonymous » » в форуме JAVA - 0 Ответы
- 51 Просмотры
-
Последнее сообщение Anonymous
-