我想要完成的是:
我目前还在学习spring-orm,但是找不到关于这方面的文档,还没有针对此的测试项目。
所以我的问题是:
我有以下测试设置:
@javax.persistence.Entity
public class Entity {
@Id
@GeneratedValue
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
@Repository
public class Dao {
@PersistenceContext
private EntityManager em;
public void insert(Entity ent) {
em.persist(ent);
}
@SuppressWarnings("unchecked")
public List<Entity> selectAll() {
List<Entity> ents = em.createQuery("select e from " + Entity.class.getName() + " e").getResultList();
return ents;
}
}
如果我这样,即使在hibernate中启用了自动提交,insert方法也不会做任何事情。我必须将@Transactional添加到插入或调用插入的方法才能使其工作...
有没有办法让@Transactional完全可选?
答案 0 :(得分:1)
@Transactional
具有propagation
属性,用于标识调用新方法时的事务行为。默认值为REQUIRED
,这是您想要的。 Here您可以找到该概念的图形表示。如果您使用aop设置事务方法,则可以省略@Transactional
,如下所示:
<aop:config>
<aop:pointcut id="serviceMethods"
expression="execution(* com.company.product.service..*.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethods" />
</aop:config>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*" propagation="REQUIRED" />
</tx:attributes>
</tx:advice>
这使得service
包事务中的所有公共方法。
另外,请随时阅读有关春季交易的整章。