此处将为大家介绍关于调用EntityManager.getTransaction的详细内容,并且为您解答有关时出现EJBException的相关问题,此外,我们还将为您介绍关于@ResourceUse
此处将为大家介绍关于调用EntityManager.getTransaction的详细内容,并且为您解答有关时出现EJBException的相关问题,此外,我们还将为您介绍关于@Resource UserTransaction和EntityManager.getTransaction()之间有什么区别、Android上带有DriverManager.getConnection()的UnsupportedOperationException、BeanCreationException:创建在类路径资源[org /…/ DataConfiguration.class]中定义的名称为'entityManagerFactory'的bean时出错:、c# – TransactionScope中的Membership.GetUser()抛出TransactionPromotionException的有用信息。
本文目录一览:- 调用EntityManager.getTransaction()时出现EJBException(调用∨4失败是什么)
- @Resource UserTransaction和EntityManager.getTransaction()之间有什么区别
- Android上带有DriverManager.getConnection()的UnsupportedOperationException
- BeanCreationException:创建在类路径资源[org /…/ DataConfiguration.class]中定义的名称为'entityManagerFactory'的bean时出错:
- c# – TransactionScope中的Membership.GetUser()抛出TransactionPromotionException
调用EntityManager.getTransaction()时出现EJBException(调用∨4失败是什么)
这可能有些琐碎,但我希望获得一些帮助。
我得到:
javax.ejb.EJBException: java.lang.IllegalStateException: Illegal to call this method from injected, managed EntityManager 11:54:37,105 ERROR [STDERR] at org.jboss.ejb3.tx.Ejb3TxPolicy.handleExceptionInOurTx(Ejb3TxPolicy.java:77) 11:54:37,105 ERROR [STDERR] at org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:83) 11:54:37,105 ERROR [STDERR] at org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:190)
做的时候:
@PersistenceContext(unitName = "someName")private EntityManager em;...final EntityManager entityManager = getEntityManager();final EntityTransaction tx = entityManager.getTransaction(); // here
谁能告诉我原因是什么?
答案1
小编典典在Java
EE受管上下文中,获取对与EntityManager关联的EntityTransaction实例的引用是非法的。从EntityManager.getTransaction()的Java
EE API文档中:
返回资源级的EntityTransaction对象。EntityTransaction实例可以顺序使用以开始和提交多个事务。
Returns: EntityTransaction instanceThrows: IllegalStateException - if invoked on a JTA entity manager
最后一行与此相关。
当使用@PersistenceContext或@Inject批注将EntityManager注入部署在应用程序服务器上的EJB中时,EntityManager将由容器而不是由应用程序管理。容器管理的实体管理器必须是JTA实体管理器;应用程序管理的实体管理器可以是资源本地实体管理器。这由JPA规范规定:
通过JTA控制基础交易的实体管理器称为JTA实体管理器。
由应用程序通过EntityTransaction API控制其基础事务的实体管理器称为资源本地实体管理器。
容器管理的实体管理器必须是JTA实体管理器。 JTA实体管理器仅指定用于Java EE容器。
从第一点推断(关于IllegalStateException),您必须不获取容器注入的EntityManagers的EntityTransaction参考。但是,如果容器仅注入EntityManagerFactory,并且您的应用程序通过调用来获得EntityManager引用,则可以这样做EntityManagerFactory.getEntityManager
。
另外,应该注意,EntityManager.getTransaction()
对于JTA实体管理者而言,调用是没有意义的。JPA规范在EntityTransaction接口的定义中指出了这一点:
EntityTransaction接口用于控制资源本地实体管理器上的资源事务。
关于管理JTA事务本身的主题,如果您需要自己管理事务边界(即使用Bean管理的事务),请注入UserTransaction
实例。或者,如果您希望容器管理事务,则只需使用适当的TransactionalAttribute值注释方法或bean
。
在应用程序服务器中,将本地资源实体管理器(和数据源)与bean管理的事务或容器管理的事务一起使用通常不是一个好主意,但这是可以做到的。
您可以在Hibernate
EntityManager文档中找到一个合适的示例来演示BMT配合使用EntityManager的使用。如果您已经注释了bean类或方法,则CMT更为简单。您只需避免调用getEntityTransaction()
CMT起作用的方法。
如果您希望进一步了解,我建议阅读JPA 2.0规范的第7章,标题为“实体管理器和持久性上下文”。本章中提供的示例演示:
- 如何在应用服务器(通常是使用它们的地方)中使用JTA实体管理器。
- 如何在应用程序服务器中使用资源本地实体管理器。
- 如何在Java SE应用程序中使用资源本地实体管理器。
@Resource UserTransaction和EntityManager.getTransaction()之间有什么区别
谁能解释一下:
@Resource
UserTransaction objUserTransaction;
和
EntityManager.getTransaction();
还有什么是容器管理的交易?如果要在事务中的表中插入三行,应该如何在会话外观中执行此操作。
Android上带有DriverManager.getConnection()的UnsupportedOperationException
我无法将JDBC连接到我的数据库,出现以下错误
Error : E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.myprojectapplication,PID: 32686
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.myprojectapplication/com.example.myprojectapplication.MainActivity}:
java.lang.UnsupportedOperationException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
Caused by: java.lang.UnsupportedOperationException
at java.util.regex.Matcher.group(Matcher.java:383)
at com.mysql.cj.conf.ConnectionUrlParser.isConnectionStringSupported(ConnectionUrlParser.java:152)
at com.mysql.cj.conf.ConnectionUrl.acceptsUrl(ConnectionUrl.java:258)
at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:187)
at java.sql.DriverManager.getConnection(DriverManager.java:569)
at java.sql.DriverManager.getConnection(DriverManager.java:219)
at com.example.myprojectapplication.ObjectClass.JDBC.CONN(JDBC.java:19)
at com.example.myprojectapplication.MainActivity.onCreate(MainActivity.java:72)
at android.app.Activity.performCreate(Activity.java:6662)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
package com.example.myprojectapplication.ObjectClass;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class JDBC {
public void CONN() {
Connection con = null;
try {
String url = "jdbc:mysql://localhost:3306/prog";
String username = "root";
String password = "mysql";
Class.forName("com.mysql.jdbc.Driver");
con = DriverManager.getConnection(url,username,password);
if (con != null) {
System.out
.println("Successfully connected to MySQL database test");
}
} catch (SQLException ex) {
System.out
.println("An error occurred while connecting MySQL databse");
ex.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (UnsupportedOperationException exa){
exa.printStackTrace();
}
}
}
BeanCreationException:创建在类路径资源[org /…/ DataConfiguration.class]中定义的名称为'entityManagerFactory'的bean时出错:
如何解决BeanCreationException:创建在类路径资源[org /…/ DataConfiguration.class]中定义的名称为''entityManagerFactory''的bean时出错:?
我有一个@Embedded
实体,需要@OnetoOne
在其参考上添加注释。
解决方法
我有一个正在运行的项目。我添加了将近200个实体,现在出现“创建名称为’entityManagerFactory’的bean时出错”。我没有故意改变其他任何东西。
我正在使用Java风格的配置。
我得到以下内容:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name ''entityManagerFactory'' defined in class path resource [org/cru/cloud/management/config/DataConfiguration.class]:
Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1554)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:975)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:752)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482)
at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:403)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4749)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5175)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:724)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:700)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:714)
at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:581)
at org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:1686)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.persistenceException(EntityManagerFactoryBuilderImpl.java:1225)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.access$600(EntityManagerFactoryBuilderImpl.java:119)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:853)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:843)
at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:398)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:842)
at org.hibernate.jpa.HibernatePersistenceProvider.createContainerEntityManagerFactory(HibernatePersistenceProvider.java:152)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:336)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:318)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1613)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1550)
... 25 more
Caused by: org.hibernate.MappingException: component property not found: id
at org.hibernate.mapping.Component.getProperty(Component.java:293)
at org.hibernate.cfg.AnnotationBinder.fillComponent(AnnotationBinder.java:2651)
at org.hibernate.cfg.AnnotationBinder.fillComponent(AnnotationBinder.java:2524)
at org.hibernate.cfg.AnnotationBinder.bindComponent(AnnotationBinder.java:2473)
at org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:2198)
at org.hibernate.cfg.AnnotationBinder.processIdPropertiesIfNotAlready(AnnotationBinder.java:963)
at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:796)
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processAnnotatedClassesQueue(Configuration.java:3788)
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(Configuration.java:3742)
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1410)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1844)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:850)
... 33 more
我的pom.xml是:
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-samples-hellomvc-jc</artifactId>
<version>3.2.5.RELEASE</version>
<packaging>war</packaging>
<name>spring-security-samples-hellomvc-jc</name>
<description>spring-security-samples-hellomvc-jc</description>
<url>http://spring.io/spring-security</url>
<properties>
<m2eclipse.wtp.contextRoot>/</m2eclipse.wtp.contextRoot>
<!-- spring.version>3.2.11.RELEASE</spring.version -->
<!-- spring.security.version>3.2.5.RELEASE</spring.security.version -->
<!-- hibernate.entity.manager.version>3.6.10.Final</hibernate.entity.manager.version -->
<!-- hibernate.jpa.api.version>1.0.0.Final</hibernate.jpa.api.version -->
<!-- spring.data.jpa.version>1.3.4.RELEASE</spring.data.jpa.version -->
<!-- slf4j.version>1.7.5</slf4j.version -->
<spring.version>4.0.7.RELEASE</spring.version>
<spring.security.version>3.2.5.RELEASE</spring.security.version>
<hibernate.entity.manager.version>4.3.6.Final</hibernate.entity.manager.version>
<hibernate.jpa.api.version>1.0.1.Final</hibernate.jpa.api.version>
<spring.data.jpa.version>1.7.0.RELEASE</spring.data.jpa.version>
<slf4j.version>1.7.7</slf4j.version>
</properties>
<organization>
<name>spring.io</name>
<url>http://spring.io/</url>
</organization>
<licenses>
<license>
<name>The Apache Software License,Version 2.0</name>
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
<distribution>repo</distribution>
</license>
</licenses>
<developers>
<developer>
<id>rwinch</id>
<name>Rob Winch</name>
<email>rwinch@gopivotal.com</email>
</developer>
</developers>
<scm>
<connection>scm:git:git://github.com/spring-projects/spring-security</connection>
<developerConnection>scm:git:git://github.com/spring-projects/spring-security</developerConnection>
<url>https://github.com/spring-projects/spring-security</url>
</scm>
我的DataConfiguration包含:
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory()
{
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
vendorAdapter.setDatabase(Database.H2);
vendorAdapter.setGenerateDdl(true);
LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
factory.setJpaVendorAdapter(vendorAdapter);
factory.setPackagesToScan("org.cru.cloud.management.core.repository","org.cru.repository");
factory.setDataSource(dataSource());
return factory;
}
c# – TransactionScope中的Membership.GetUser()抛出TransactionPromotionException
using ( TransactionScope transactionScope = new TransactionScope() ) { try { using ( MyDataContext context = new MyDataContext() ) { Guid accountID = new Guid( Request.QueryString[ "aid" ] ); Account account = ( from a in context.Accounts where a.UniqueID.Equals( accountID ) select a ).SingleOrDefault(); IQueryable < My_Data_Access_Layer.Login > loginList = from l in context.Logins where l.AccountID == account.AccountID select l; foreach ( My_Data_Access_Layer.Login login in loginList ) { MembershipUser membershipUser = Membership.GetUser( login.UniqueID ); } [... lots of DeleteallOnSubmit() calls] context.SubmitChanges(); transactionScope.Complete(); } } catch ( Exception E ) { [... reports the exception ...] } }
在调用Membership.GetUser()时发生错误.
我的连接字符串是:
<add name="MyConnectionString" connectionString="Data Source=localhost\sqlEXPRESS;Initial Catalog=MyDatabase;Integrated Security=True" providerName="System.Data.sqlClient" />
我read的一切都告诉我,TransactionScope应该神奇地应用于会员电话.用户存在(否则我希望返回null.)
解决方法
尝试将TransactionScope中的所有内容包装在try-catch块中,并在catch中重新抛出,并在那里设置断点;你应该能够看到真正的错误是什么.
另一件事,TransactionScope.Complete应该是在包含TransactionScope的using块结束之前执行的最后一个语句.在这种情况下,你可能应该没问题,因为之后你实际上并没有做任何工作,但是在内部范围内调用Complete会导致更多容易出错的代码.
更新:
既然我们知道内部异常是什么(失败促进交易),那么更清楚的是发生了什么.
问题是在TransactionScope中,实际上是在用GetUser打开另一个数据库连接.成员资格提供者不知道如何重新使用您已经打开的DataContext;它必须打开自己的连接,当TransactionScope看到它时,它会尝试升级到分布式事务.
它失败了,因为您可能在Web服务器,数据库服务器或两者上都禁用了MSDTC.
如果要打开两个单独的连接,则无法避免分布式事务,因此实际上有几种解决此问题的方法:
>在TransactionScope外部移动GetUser调用.也就是说,首先从会员提供者“读取”用户到列表中,然后在实际需要开始修改时启动事务.
>完全删除GetUser调用并直接从数据库,同一DataContext或至少相同的连接读取用户信息.
>在参与交易的所有服务器上启用DTC(当事务提升时,性能将受到影响).
我认为选项#1在这种情况下将是最好的;您需要从会员提供商处读取的数据在您阅读它和开始交易的时间之间进行更改是不太可能的.
关于调用EntityManager.getTransaction和时出现EJBException的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于@Resource UserTransaction和EntityManager.getTransaction()之间有什么区别、Android上带有DriverManager.getConnection()的UnsupportedOperationException、BeanCreationException:创建在类路径资源[org /…/ DataConfiguration.class]中定义的名称为'entityManagerFactory'的bean时出错:、c# – TransactionScope中的Membership.GetUser()抛出TransactionPromotionException等相关内容,可以在本站寻找。
本文标签: