Автономный JTA с Narayana 7, Spring 6 и Hibernate 6.JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Автономный JTA с Narayana 7, Spring 6 и Hibernate 6.

Сообщение Anonymous »

Я пытаюсь использовать 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»