标签: transactional

JUnit 测试事务方法

我是 JUnit 新手,正在尝试测试使用 JPA DAO 的 Spring Web 服务。我需要测试类似于下面的服务方法。

服务方法使用注释@Transactional(propagation=Propagation.REQUIRED)ServiceObjectRepository.update()方法调用本机 sql 查询来更新数据库。

@Transactional(propagation=Propagation.REQUIRED)    
public void serviceMethod(){
        //Read DB for ServiceObject to update
        //Call  ServiceObjectRepository.update() method to update DB
}
Run Code Online (Sandbox Code Playgroud)

服务对象存储库

public interface ServiceObjectRepository  extends JpaRepository<ServiceObject, Integer> {

    @Query(value ="UPDATE serviceobjcet AS c SET c.objectstatus= :os WHERE c.objid = :oi", nativeQuery = true)
    public Integer update(@Param("os")short objStatus,@Param("oi")int objId);    
}
Run Code Online (Sandbox Code Playgroud)

测试类

@TransactionConfiguration(defaultRollback=true)
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(
        locations = "classpath:service-test.xml")
@Transactional
public class ServiceHandlerTest {

    @Test
    public void testServiceMethod() {

        //Create …
Run Code Online (Sandbox Code Playgroud)

java junit spring transactional

5
推荐指数
1
解决办法
1万
查看次数

如何获取 Hibernate/Spring Data 中 @Transactional 注释使用的当前会话?

我一直在使用数据源中的 Callable 语句执行存储过程。现在,该过程必须从同一服务中 SP 执行之前执行的插入查询中读取数据。因此这会产生一个问题,因为整个服务都围绕着 @Transactional 注释,并且只有在服务完成后才会完成提交。那么,有没有办法获取当前@Transactional注解的当前会话。SessionFactory 的 getCurrentSession 给了我一个不同的会话。

spring hibernate transactional spring-data-jpa

5
推荐指数
1
解决办法
8159
查看次数

spring data如何清理事务方法中的持久实体?

我需要使用 spring data 通过 hibernate 接收和保存大量数据。我们的服务器分配的 RAM 不足以同时保存所有实体。我们肯定会得到 OutOfMemory 错误。

所以我们需要批量保存数据,这是显而易见的。此外,我们还需要使用 @Transactional 来确保所有数据都保留或不保留,即使发生单个错误。

那么,问题是: @Transactional 方法期间的 spring 数据是否继续将实体存储在 RAM 中,或者垃圾收集器可以访问刷新的实体?

那么,使用 Spring Data 处理大量数据的最佳方法是什么?也许 Spring Data 不是解决此类问题的正确方法。

java spring hibernate transactional spring-data

5
推荐指数
1
解决办法
1394
查看次数

Hibernate SQLQuery绕过了hibernate会话缓存

我正在"事务化"一些广泛的数据库操作,我遇到了这个问题,如果我通过hibernate运行sql查询但不使用MQL方法,数据库的视图看起来不正确.具体来说,代码在大多数情况下以更合适的方式使用hibernate,但有些地方有人决定只执行sql.我不喜欢他们这样做,但在这一点上"它就是它".

我发现了一个解释,这似乎解释,但所有的例子都是WRT却越来越和管理代码交易.我们在整个类上使用@TransactionAttribute注释来更改此代码,并且发现了许多发生此行为的地方,但我并不完全相信这些解释适用于简单地包含在注释中的代码 - 我假设任何使用hibernate管理器的东西都依赖于会话中的对象缓存.

如果我通过不正确的术语来指代休眠中的概念等,请提前道歉.

jboss hibernate transactional

4
推荐指数
2
解决办法
4075
查看次数

使用@Transactional时,此行上有多个标记

例如:

@Transactional 
public boolean addPersonToDb(Person p) { // message on this line
 //some logic
}
Run Code Online (Sandbox Code Playgroud)

代码编译并运行没有问题.

消息本身:此行有多个标记

  • 器物

com.pname1.pname2.pname3.pname4.PersonDAO.addPersonToDb

  • 建议

org.springframework.transaction.interceptor.TransactionInterceptor.invoke(org.aopalliance.intercept.MethodInvocation)

我无法真正理解它是一个错误还是只是一条消息,看着其他线程的人将其视为错误.如果我的交易有效,我只是担心.

好的,该类实现了接口及其方法注释为事务性,有什么不对吗?

更新:解决了一些小错误,网络应用程序工作,但我仍然得到该消息(不是在堆栈跟踪,但在线断点):

由org.springframework.transaction.interceptor.TransactionInterceptor.invoke(org.aopalliance.intercept.MethodInvocation)提供建议

现在的情况:

        @Transactional
   public void registerNewUser(Person p) { // this gives message on line breakpoint - advised by ...; AND this method is implemented by interface

    pd.addPersonToDb(p);


}

@Transactional
public void blabla(Person p){ // this does not, as expected; AND it is not in interface

}
Run Code Online (Sandbox Code Playgroud)

我的交易是否有效?(我没有例外和Web应用程序运行,方法工作)

我无法理解这条消息是否错误?

spring transactional markers

4
推荐指数
1
解决办法
1万
查看次数

在@Transactional交易期间提交

是否可以在标记为Spring的@Transactional的方法中执行提交?

@PersistenceContext
private EntityManager em;

@Transactional(propagation = Propagation.REQUIRED)
public void saveMembersWithMultipleCommits(List<Member> members)
    throws HibernateException
{
    Iterator<Member> it = members.iterator();
    while (it.hasNext())
    {
        while (it.hasNext())
        {
            Member wsBean = it.next();
            em.persist(wsBean); // overall commit will be made after method exit
            log.info("Webservices record " + wsBean + " saved. " + i++);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我想在说出每500个项目之后提交DB.这可能与上述背景有关吗?

spring hibernate jpa transactions transactional

4
推荐指数
2
解决办法
2万
查看次数

Spring data - two different data sources on the same transaction causing abnormality

We are using atomikos JTA with spring and 2 different mysql datasources.

We got a problem,

When we use two different repositories (of 2 different datasources) on the same @Transactional method we get an error:

Caused by: java.sql.SQLException: Unable to enlist connection the transaction
Run Code Online (Sandbox Code Playgroud)

This happens when the second repository is doing some action against the data source.

We believe it got something to do with the transaction manager (atomikos jta) that might have issues when 2 different data sources …

spring transactional transactionmanager atomikos spring-data

4
推荐指数
1
解决办法
1万
查看次数

Spring-boot&hibernate,使用事务

我正在尝试使用spring-boot和hibernate.当我使用存储库时,它运行良好,但我正在尝试使用Hibernate会话来创建DAO,并且此DAO不是事务的一部分.

这是测试代码:

Application.java

@Configuration
@ComponentScan
@EnableAutoConfiguration
@EnableTransactionManagement
public class Application implements CommandLineRunner {

    @Autowired
    private UserBusiness userBusiness;

    @Autowired
    @Bean(name="sessionFactory")
    public SessionFactory sessionFactory(HibernateEntityManagerFactory factory) {
        return factory.getSessionFactory();
    }       

    @Override
    public void run(String... arg0) throws Exception {
        try {
            userBusiness.createAdminUsers();
        } catch (Exception e) {
            e.printStackTrace();
        }

        System.out.println(userBusiness.listAll());
    }

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args).close();
    }
}
Run Code Online (Sandbox Code Playgroud)

UserBusinessImpl.java:

@Service
public class UserBusinessImpl implements UserBusiness {

    @Autowired
    private UserRepository userRepository;

    @Autowired
    private UserDao userDao;

    @Transactional(rollbackFor=Exception.class)
    public void createAdminUsers() throws Exception { …
Run Code Online (Sandbox Code Playgroud)

hibernate transactional spring-boot

4
推荐指数
1
解决办法
8418
查看次数

Spring Transactional TimeOut

我正在尝试使用spring @Transactional注释和timeout参数.我基本上用一些Thread.sleep()代码来测试代码.然后我按照预期得到超时异常.另外,当数据库操作花费的时间超过我的超时时间时,我想获得超时异常.我使用for update select语句在数据库的表中锁定记录.我尝试更新该记录.但程序等待,什么也不做.这是我的示例代码.

@Transactional(rollbackFor = Exception.class, timeout=5)
public void executeService(List<sendData> list) throws Exception{
    List<sendData> newList = gDAO.updateSentList(list);

} 
Run Code Online (Sandbox Code Playgroud)

在这种情况下,程序应该抛出超时异常.我该如何解决?

java spring transactional

4
推荐指数
2
解决办法
2万
查看次数

CrudRepository .delete()方法是事务性的吗?

使用Spring-data时,可以扩展CrudRepository.

这个存储库.delete()方法如何在"引擎盖下"工作?

还有,这个方法Transactional呢?如果是这种情况,使用@Transactional时是否需要使用注释Spring-data.

例如,在@Transactional这里需要的?:

扩展CrudRepository:

public interface PersonRepository extends CrudRepository<Person, Integer> {

}
Run Code Online (Sandbox Code Playgroud)

在服务类中使用delete方法:

 @Transactional
 public void deletePerson(Person person) {

        personRepository.delete(person);
    }
Run Code Online (Sandbox Code Playgroud)

编辑:怎么会@Transactional在这里工作?

 @Transactional
     public void deletePersonAndTable(Person person, Table table) {

            personRepository.delete(person);

            tableRepository.delete(Table);

        }
Run Code Online (Sandbox Code Playgroud)

java spring crud transactional spring-data

3
推荐指数
1
解决办法
8986
查看次数