相关疑难解决方法(0)

您是否需要数据库事务来读取数据?

当我尝试从数据库中读取数据时,至少使用

((Session)em.getDelegate()).createCriteria()

抛出异常是说交易不存在.

当我添加注释时:

@Transactional(
    value = SomeClass.TRANSACTIONAL_MANAGER, 
    propagation = Propagation.SUPPORTS, 
    readOnly = true
)
Run Code Online (Sandbox Code Playgroud)

它工作正常.

但是,由于读取将每秒发生数百万次访问和读取数据,我想确保我们的环境不会被不必要地堵塞.

如果没有,创建只读Propagation.Supports事务的成本是多少?

没有事务,我可以不与Spring一起创建一个Hibernate Criteria Query吗?

java spring hibernate transactions jdbc

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

没有交易的JPA

我是JPA的新手.我正在开发一个使用JPA(Hibernate实现)和Spring的应用程序.我在我的persistence.xml中声明了一个持久性单元,并在我的Spring配置文件中配置了关于EntityManagerFactory的配置.像这样的东西:

<bean id="myEmf"   class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
  <property name="dataSource" ref="dataSource" />
  <property name="packagesToScan" value="my.package" />
  <property name="jpaVendorAdapter">
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
  </property>
  <property name="jpaProperties">
     <props>
        <prop key="hibernate.hbm2ddl.auto">create-drop</prop>
        <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
     </props>
  </property>
Run Code Online (Sandbox Code Playgroud)

然后我有一些DAO,我用@PersistenceContext注释注入entityManager:

public MyDaoImpl implements MyDao{
   private EntityManager entityManager;

   @PersistenceContext
   private void setEntityManager(EntityManager em){
        this.entityManager = em;
    }
 } 
Run Code Online (Sandbox Code Playgroud)

最后,我有一些注入DAO的服务(通过@Autowired Spring的注释):

public MyServiceImpl implements MyService{
  @Autowired
  private MyDao myDao;

  public List<MyEntity> readOperation(){
   //
   return myDAo.searchAll();
 }
}
Run Code Online (Sandbox Code Playgroud)

作为一个只读操作,我认为它不需要@Transactional注释,但没有它,有一个例外:

java.lang.IllegalStateException: No transactional EntityManager available
    at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:223)
    at $Proxy121.unwrap(Unknown Source) 
Run Code Online (Sandbox Code Playgroud)

我读过其他一些帖子:java.lang.IllegalStateException:没有可用的事务性EntityManager

所有人都说需要交易注释.这是真的,它适用它,但我想知道(和为什么)所有方法(甚至只读操作)必须是事务性的.

java jpa transactions

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

标签 统计

java ×2

transactions ×2

hibernate ×1

jdbc ×1

jpa ×1

spring ×1