标签: transactional

如何为Spring Roo实体实现"全部删除"?

我正在尝试删除Spring Roo实体的所有数据库条目.当我看到*_Roo_Entity.aj它似乎没有"全部删除"方法.我试图自己实现它(Licences是Roo实体的名称.不要介意命名.它是从数据库设计的,可能会在以后更改):

public static int Licences.deleteAll() {
    return entityManager().createQuery("delete from Licences o").executeUpdate();
}
Run Code Online (Sandbox Code Playgroud)

它编译得很好但是当我打电话时Licences.deleteAll()我得到以下异常:

org.springframework.dao.InvalidDataAccessApiUsageException: Executing an update/delete query; 
nested exception is javax.persistence.TransactionRequiredException: Executing an update/delete query (NativeException)
Run Code Online (Sandbox Code Playgroud)

添加@Transactional并没有什么区别.

我在这里错过了什么?

这种方法是完全错误的,我需要像这样实现它:

    public static void Licences.deleteAll() {
        for (Licences licence : findAllLicenceses()) {
            licence.remove();
        }
    }
Run Code Online (Sandbox Code Playgroud)

这是有效的,但JPA是否足够智能delete from licences将其转换为查询或是否会创建n查询?

jpa transactional spring-roo

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

Seam @Transactional注释不起作用?

我在接缝组件上使用@Transactional注释类似于:

@Name( "myComponent" )
@AutoCreate
public class MyComponent
{
    public void something() {
        ...
        doWork();
    }
    ...
    @Transactional
    protected void doWork() {
        try {
            log.debug( "transaction active: " + Transaction.instance().isActive() );
        } catch (Exception ignore) {}

        // some more stuff here that doesn't appear to be inside a transaction
    }
}
Run Code Online (Sandbox Code Playgroud)

在"更多东西"部分,我正在修改一些Hibernate实体,然后有一个错误,抛出异常.我注意到Exception没有导致事务被回滚(修改后的实体仍在db中被修改)所以我添加了"事务活动"日志记录.执行此代码时,isActive()返回false.

有什么我想念的吗?为什么交易不活跃?

如果它很重要,我正在使用另一个使用RESTEasy注释的组件内部的Seam组件来触发我的方法调用.

java oracle seam transactional

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

SQL Server - 有什么更好的替代方法可以提高大量插入的冗长事务的性能?

我有一个场景,屏幕上的用户操作导致在大约50个不同的表中实时创建新记录.用例的设计使得用户操作创建的新记录立即需要用户进行更改.所以没有离线或延迟创作的可能性.

话虽如此,显而易见的问题是 - 插入语句(以及一些额外的操作语句)都在事务中,这使得它成为一个非常冗长的事务.这将运行大约30秒,通常会导致超时或阻止其他查询.

原子性需要交易.有没有更好的方法可以拆分事务并保持一致性?或任何其他方法来改善目前的情况?

sql sql-server transactions transactional sqltransaction

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

如何使用事务范围的持久化上下文进行非事务性读取查询?

我读了Spring文档,它说:

@PersistenceContext注释具有可选的属性类型,默认为PersistenceContextType.TRANSACTION.此默认值是接收共享EntityManager代理所需的内容.

  1. 这是否意味着我必须让EntityManager在事务中工作?
  2. 它如何用于非事务性方法(读取查询),例如下面代码中的loadProductsByCategory?
  3. "共享"是什么意思?如何使用EntityManager与他人共享?
  4. 我是否需要将@Transactional添加到方法loadProductsByCategory以便将EntityManager绑定到线程?因为ProductDaoImpl类是单例并且在多线程中工作,但是entityManager不是线程安全的.

    @Service
    public class ProductDaoImpl implements ProductDao {
        @PersistenceContext
        private EntityManager em;
        public Collection loadProductsByCategory(String category) {
            Query query = em.createQuery("from Product as p where p.category = :category");
            query.setParameter("category", category);
            return query.getResultList();
        }
        @Transactional
        public void loadProductsByCategory(Product product) {
            em.persist(product);
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

spring scope jpa transactional

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

@Transactional导致spring框架中的nosuchbeandefinitionexception

使用@transactional注释我的服务类的方法时遇到问题.这样的注释会在我的测试类中导致NoSuchBeanDefinitionExcpetion,其中服务类是自动装配的.如果删除了事务性注释,它将再次正常工作.为什么会这样,我在spring文档中找不到线索.

这是我的application-context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
     http://www.springframework.org/schema/beans 
                    http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
                    http://www.springframework.org/schema/jdbc 
                    http://www.springframework.org/schema/jdbc/spring-jdbc-3.1.xsd
                    http://www.springframework.org/schema/context 
                    http://www.springframework.org/schema/context/spring-context-3.1.xsd">

<context:component-scan base-package="<mypackage...>" />

<import resource="data-context.xml"/>

<import resource="resources-context.xml"/>

<import resource="persistence-context.xml"/>
Run Code Online (Sandbox Code Playgroud)

这是我的persistence-context.xml的一部分

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springframework.org/schema/beans 
                    http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
                    http://www.springframework.org/schema/context 
                    http://www.springframework.org/schema/context/spring-context-3.1.xsd">


<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSourceConnection" />
    <property name="configLocation"
        value="classpath:configuration/mybatis/config.xml"></property>
</bean>


<bean id="txManager"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSourceConnection" />
</bean>
<tx:annotation-driven transaction-manager="txManager" />

<bean id="accessDao" class="dao.impl.AccessDaoImpl">
    <property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>

<bean id="utilitiesDao" class="dao.impl.UtilitiesDaoImpl">
    <property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>

<bean id="portafoglioDao" …
Run Code Online (Sandbox Code Playgroud)

spring exception transactional

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

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

Spring Java配置,@ Autowire与构造函数注入,@ Transaction和CGLIB

我们一直在使用@Autowired基于Java的Spring配置并取得了一些成功,但现在我们失去了控制权.每个人都开始在任何地方添加自动连接的依赖项,创建周期和奇怪的错误.

所以我们正在考虑使用构造函数注入和Spring配置的自动装配.

旧:

class Bean {
   @Autowired Foo foo;
}

@Configuration
@Import( FooCfg.class )
class BeanCfg {
   @Bean public Bean bean() { return new Bean(); }
}
Run Code Online (Sandbox Code Playgroud)

新:

class Bean {
   public Bean(Foo foo) {...}
}

@Configuration
class BeanCfg {
   @Autowired FooCfg fooCfg;
   @Bean public Bean bean() { return new Bean(fooCfg.foo()); }
}
Run Code Online (Sandbox Code Playgroud)

这非常有效(并且它驱使人们分割bean而不是创建具有10个以上构造函数参数的怪物).

但是当Bean有一个方法注释时它会失败,@Transactional因为CGLIB然后尝试创建一个失败的代理,因为它找不到无参构造函数.

这是什么解决方案?

spring proxy-classes transactional autowired cglib

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

@Tansactional和@Aspect排序

我想在@Transactional事务开始之前执行我的代码。

@Aspect
@Order(Ordered.HIGHEST_PRECEDENCE)
//@Order(Ordered.LOWEST_PRECEDENCE)
public class SynchronizerAspect {

  @Pointcut("execution(public * xxx.xxx.services.*.*(..))")
  private void anyServiceOperation() {
  }

  @Around("anyServiceOperation()")
public Object synchronizerAdvice(ProceedingJoinPoint joinPoint) throws Throwable {
    System.out.println("Synchronizing : " + joinPoint.getSignature().getName());
return joinPoint.proceed();
  }
Run Code Online (Sandbox Code Playgroud)

当我调用标记为@Transactional的服务方法时,我总是在事务内部执行我的方面代码:

[INFO] INFO: FETCH created: Fri Oct 30 15:43:11 UTC 2015 duration: 0 connection: 40 statement: 999 resultset: 0
[INFO] pa?? 30, 2015 3:43:11 PM com.mysql.jdbc.log.Slf4JLogger logInfo
[INFO] INFO: QUERY created: Fri Oct 30 15:43:11 UTC 2015 duration: 1 connection: 40 statement: 14 resultset: 15 message: …
Run Code Online (Sandbox Code Playgroud)

spring aspectj transactional spring-aop aspectj-maven-plugin

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

Hibernate/Spring - 在事务中回滚事务

鉴于此示例代码:

public class MyServiceImpl implements MyService {
    @Transactional
    public void myTransactionalMethod() {
        List<Item> itemList = itemService.findItems();
        for (Item anItem : itemList) {
            try {
                processItem(anItem);
            catch (Exception e) {
                // dont rollback here 
                // rollback just one item
            }     
        }

    }

    @Transactional
    public void processItem(Item anItem) { 
        anItem.setSomething(new Something);
        anItem.applyBehaviour();
        itemService.save(anItem);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我想要实现的目标:

  1. 只有processItem(anItem);在其中发生异常时才应回滚.
  2. 如果发生异常,myTransactionalMethod应该继续,这意味着for-each应该结束.
  3. 如果异常发生在内部myTransactionalMethod但不在内processItem(anItem),myTransactionalMethod则应完全回滚.

是否存在不涉及手动管理事务(没有注释)的解决方案?

编辑:我正在考虑使用@Transactional(PROPAGATION=REQUIRES_NEW),不知道它是否会在同一个bean中工作.

java spring hibernate transactional

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

java.lang.IllegalArgumentException:无法设置为com.sun.proxy.$ Proxy

我正在使用Spring MVC开发一个Web应用程序.

这是我得到的例外:

Exception while loading the app : java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: org.apache.catalina.LifecycleException: java.lang.IllegalArgumentException: Can not set com.onclave.papercraft.DAO.tenantDAO.Implementation.UsersDAOImplementation field com.onclave.papercraft.DAO.tenantDAO.Controller.UsersDAOController.usersDAOImplementation to com.sun.proxy.$Proxy301
Run Code Online (Sandbox Code Playgroud)

我有一个控制器: StudentController.java

@Controller
public class StudentsController {

    @Autowired
    private UsersDAOController usersDAOController;

    . . .

    private final String USER_TYPE = "student";

    @Transactional
    @RequestMapping(value = "/PAuth/user/add/user/student", method = RequestMethod.POST)
    public long addNewStudent(HttpServletRequest request) {

        long usersID = -1;

        . . .

        usersID = usersDAOController.storeNewUser(request, USER_TYPE);

        . . .
    }

    . . .
}
Run Code Online (Sandbox Code Playgroud)

这是UsersDAOController.java:

@Controller
@Configurable
public …
Run Code Online (Sandbox Code Playgroud)

java spring transactional autowired illegalargumentexception

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