谁能解释一下有什么区别:
@Resource
UserTransaction objUserTransaction;
Run Code Online (Sandbox Code Playgroud)
和
EntityManager.getTransaction();
Run Code Online (Sandbox Code Playgroud)
什么是容器管理交易?如果我想在事务中的表中插入三行,我应该如何在会话外观中执行此操作.
在阅读了有关此错误的先前问题后,似乎所有人都认为您需要在所有数据源上启用XA.但:
有关应用程序的信息:
该应用程序是在Sun Java Application Server 9.1上运行的EJB
我使用类似下面的spring上下文来设置hibernate会话工厂:
<bean id="dbADatasource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="jdbc/dbA"/>
</bean>
<bean id="dbASessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dbADatasource" />
<property name="hibernateProperties">
hibernate.dialect=org.hibernate.dialect.Oracle9Dialect
hibernate.default_schema=schemaA
</property>
<property name="mappingResources">
[mapping resources...]
</property>
</bean>
<bean id="dbBDatasource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="jdbc/dbB"/>
</bean>
<bean id="dbBSessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dbBDatasource" />
<property name="hibernateProperties">
hibernate.dialect=org.hibernate.dialect.Oracle9Dialect
hibernate.default_schema=schemaB
</property>
<property name="mappingResources">
[mapping resources...]
</property>
</bean>
Run Code Online (Sandbox Code Playgroud)
两个JNDI资源都是javax.sql.ConnectionPoolDatasoure.他们实际上都指向同一个连接池,但我们有两个不同的JNDI资源,因为有两个,完全独立的,表组将移动到在未来不同的数据库的可能性.
然后在代码中,我做:
sessionA = dbASessionFactory.openSession();
sessionB = dbBSessionFactory.openSession();
sessionA.beginTransaction();
sessionB.beginTransaction();
Run Code Online (Sandbox Code Playgroud)
sessionB.beginTransaction()行在这篇文章的标题中产生错误 - 有时候.我在两个不同的sun应用服务器上运行了应用程序.在一个运行它很好,另一个抛出错误.虽然它们连接到不同但等效的数据库,但我认为两台服务器的配置方式没有任何区别.
所以问题是
谢谢.
PS堆栈跟踪是:
Local …
Run Code Online (Sandbox Code Playgroud) 我想编写一个Java EE Web应用程序,其中不同的用户使用数据库.用户可以开始编辑记录,然后保存更改或取消编辑.在用户编辑时,应该为其他用户锁定记录.它应该锁定在数据库级别,因为还有其他非Java用户编辑同一个数据库,锁定他们所处理的记录.
我理解一些基本的Java +数据库,但我不擅长锁定这样的多用户事物.在互联网上寻找一些例子,在我看来,像Java EE技术的每个"hello world"示例都引入了至少另一种技术.要访问数据库中的对象,我使用JPA.为了锁定记录,我可能需要交易,这会带来JTA.要使用JTA,我需要JNDI.为了处理所有这些对象,我可能还需要EJB和注入......此时我想知道这是否是解决问题的最简单方法,还是我错过了重要的事情.我不知道所有这些技术是否都是必要的(如果是的话,我会使用它们;我只是想在我学习它们之前确定).我只是看到我在网上找到的例子非常慷慨地介绍了它们.
我想要一个简单的Java EE代码示例:
使用JPA;
连接到"persistence.xml"文件中描述的数据库;
有一个MyObject
属性的类,id
并name
存储在MYOBJECT
表中;
有一个方法(例如从JSP页面调用),数据库级锁定对象id = 42
(以便访问同一数据库的非Java用户也无法修改它),或者如果记录已被另一个锁定,则显示错误user(另一个Java用户或非Java用户);
有另一个方法(例如从另一个JSP调用),它可以更新name
到指定的值并释放锁,或者只在提供空字符串时释放锁.
对于您在解决方案中引入的每种新技术,我想听一个非常简短的解释为什么使用它.此外,该技术是否需要我安装新库,创建或修改配置文件,编写其他代码等(调用方法的JSP文件不是必需的;我对数据库相关的部分感兴趣.)
(另一个细节:这里描述了EntityTransaction和UserTransaction之间的区别.如果我理解正确,只有在我使用多个数据库时才需要JTA.如果我只使用一个具有不同模式的Oracle数据库,是否还需要它?如果是,那么请使用JTA编写示例代码.)