Я пытаюсь использовать 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
Программисты JAVA общаются здесь
-
Anonymous
1732537153
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
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79222996/standalone-jta-with-narayana-7-spring-6-and-hibernate-6[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия