当前位置: 首页 > 知识库问答 >
问题:

无交易的JPA

邵弘致
2023-03-14

我是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>

然后我有一些DAO,我在其中注入实体管理器与@PersistenceContext注释:

public MyDaoImpl implements MyDao{
   private EntityManager entityManager;

   @PersistenceContext
   private void setEntityManager(EntityManager em){
        this.entityManager = em;
    }
 } 

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

public MyServiceImpl implements MyService{
  @Autowired
  private MyDao myDao;

  public List<MyEntity> readOperation(){
   //
   return myDAo.searchAll();
 }
}

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

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

我读过一些类似的帖子:Java . lang . illegalstateexception:没有可用的事务性EntityManager

所有说的是需要事务注释。确实,它可以使用它,但我想知道(以及为什么)是否所有方法(甚至是只读操作)都必须是事务性的。

共有2个答案

符俊材
2023-03-14

对于更改 DB 中任何内容的所有操作,您都需要一个事务(唯一的例外是 SELECT 查询,没有锁定)。检查此答案。

杨飞
2023-03-14

您的所有方法都需要一个 JPA 事务 - 本质上,事务是打开Hibernate会话的,您需要一个打开的会话来与它进行交互。

您可以将事务注释为readonly或readwrite,还可以在类级别进行注释,以避免对每个方法进行注释。例如:

@Transactional(readOnly = true)
public MyDaoImpl implements MyDao{
    private EntityManager entityManager;

    @PersistenceContext
    private void setEntityManager(EntityManager em){
        this.entityManager = em;
    }

    @Transactional(readOnly = false)
    public void saveItem(MyEntity entity) {
    }

    public List<MyEntity> searchAll() {
    }
} 
 类似资料:
  • 我正在ASP.NET项目中实现Paypal Express结账功能,该功能需要授权,然后取消或捕获授权金额。我使用的是他们版本=104.0的API。 就我对整个过程的理解而言,我做的每件事都是正确的: > 我在付款详细信息中调用ActionType设置为“authorize”的SetExpressCheckout方法 然后我打电话给DoExprescheckout。这是请求的代码 此请求也返回“成

  • 交易 为了与Infura节点进行交易,需要在发送它们之前离线创建交易和签名,因为Infura节点没有加密的以太坊密钥文件的访问权限,这是需要通过geth或者Parity管理命令来解锁帐户。 有关详细信息,请参阅以太坊交易中离线交易和签名部分和web3j如何使用管理APIs。

  • 交易 Web3j支持使用以太坊钱包文件(推荐的)和用于发送事务的以太坊客户端管理命令。 使用以太钱包文件发送以太币给其他人: Web3j web3 = Web3j.build(new HttpService()); // defaults to http://localhost:8545/ Credentials credentials = WalletUtils.loadCredentials

  • 交易有不同的分类,不同交易有不同的操作码。 这样做的好处就是明确用户行为,简化系统复杂度。 操作码列表 OpsTransfer:用于普通的链内转账 OpsMove:用于链间的转账 OpsNewChain:用于创建新的子链 OpsNewApp:用于创建智能合约 OpsRunApp:用于执行智能合约 OpsRegisterMiner:用于注册矿工 OpsUpdateAppLife:更新智能合约的生命周

  • 问题内容: 我正在尝试使用Spring @Transactional批注,但是在调用 findAll 方法时出现问题,并且出现以下错误: 人DAO: 这是我的: 我尝试删除此行,但是又出现了一个错误,为什么这行不通? 问题答案: 您必须显式声明对事务管理器注释的支持 添加到您的配置中: tx是xmlns:tx =“ http://www.springframework.org/schema/tx”

  • composer transaction submit命令将交易提交给业务网络。 句法 composer transaction submit composer transaction submit [options] Options: --help Show help [boolean] -v, --version