我正在尝试删除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查询?
我在接缝组件上使用@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组件来触发我的方法调用.
我有一个场景,屏幕上的用户操作导致在大约50个不同的表中实时创建新记录.用例的设计使得用户操作创建的新记录立即需要用户进行更改.所以没有离线或延迟创作的可能性.
话虽如此,显而易见的问题是 - 插入语句(以及一些额外的操作语句)都在事务中,这使得它成为一个非常冗长的事务.这将运行大约30秒,通常会导致超时或阻止其他查询.
原子性需要交易.有没有更好的方法可以拆分事务并保持一致性?或任何其他方法来改善目前的情况?
我读了Spring文档,它说:
@PersistenceContext注释具有可选的属性类型,默认为PersistenceContextType.TRANSACTION.此默认值是接收共享EntityManager代理所需的内容.
我是否需要将@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)使用@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) 什么是事务缓存和非事务缓存?
它们之间有什么区别?
我们一直在使用@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然后尝试创建一个失败的代理,因为它找不到无参构造函数.
这是什么解决方案?
我想在@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
鉴于此示例代码:
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)
这是我想要实现的目标:
processItem(anItem);在其中发生异常时才应回滚.myTransactionalMethod应该继续,这意味着for-each应该结束.myTransactionalMethod但不在内processItem(anItem),myTransactionalMethod则应完全回滚.是否存在不涉及手动管理事务(没有注释)的解决方案?
编辑:我正在考虑使用@Transactional(PROPAGATION=REQUIRES_NEW),不知道它是否会在同一个bean中工作.
我正在使用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
transactional ×10
spring ×6
java ×4
autowired ×2
jpa ×2
transactions ×2
aspectj ×1
caching ×1
cglib ×1
exception ×1
hibernate ×1
oracle ×1
persistence ×1
scope ×1
seam ×1
spring-aop ×1
spring-roo ×1
sql ×1
sql-server ×1