这篇文章主要围绕PersistenceUnit与PersistenceContext展开,旨在为您提供一份详细的参考资料。我们将全面介绍PersistenceUnit与PersistenceConte
这篇文章主要围绕PersistenceUnit与PersistenceContext展开,旨在为您提供一份详细的参考资料。我们将全面介绍PersistenceUnit与PersistenceContext,同时也会为您带来CDH报错:PersistenceException: [PersistenceUnit: cmf.server] Unable to build EntityManagerFactory、Exception in thread "AWT-EventQueue-0" javax.persistence.PersistenceException: No Persi...、glassfish +jersey 用 @PersistenceContext 无法获得注入的 EntityManager、javax.persistence.PersistenceContextType的实例源码的实用方法。
本文目录一览:- PersistenceUnit与PersistenceContext
- CDH报错:PersistenceException: [PersistenceUnit: cmf.server] Unable to build EntityManagerFactory
- Exception in thread "AWT-EventQueue-0" javax.persistence.PersistenceException: No Persi...
- glassfish +jersey 用 @PersistenceContext 无法获得注入的 EntityManager
- javax.persistence.PersistenceContextType的实例源码
PersistenceUnit与PersistenceContext
在几个项目中,我已成功使用
@PersistenceUnit(unitName = "MiddlewareJPA")EntityManagerFactory emf;...EntityManager entityManager = emf.createEntityManager();
获取EntityManager
数据库连接,但是几天前,我试图将项目移至Jboss EAP6.2
,但无法创建EntityManager
。我在搜索它,发现应该尝试更改@PersistenceUnit
为
@PersistenceContext(unitName = "MiddlewareJPA")private EntityManager entityManager;
获得 EntityManager 。它有效,但我不知道为什么。有什么区别bettweenPersistenceUnit
和PersistenceContext
?每个优点和缺点是什么?我们应该在哪里使用其中之一?
答案1
小编典典我不知道它在Java
EE中是如何工作的,但是在Spring中,当您指定@PersistenceContext
批注时,它会注入EntityManager
。它从哪里得到EntityManager
?EntityManager
通过调用在整个应用程序生命周期内创建一个是错误的EntityManagerFactory.createEntityManager()
。因此,改为EntityManager
使用接口的特殊实现并直接实例化。它具有对
real 的内部可变线程局部引用EntityManager
。方法的实现只是将调用重定向到此 realEntityManager
。并且有一个servlet侦听器,该侦听器在每个请求之前EM
通过调用获取EMF.createEntityManager()
并将其分配给special的内部引用EM
。另外这款监听器调用管理事务getTransaction().begin()
,.commit()
并.rollback()
在
实际 EM
。这是对已完成工作的非常简化的描述。而且我相信,JEE容器的作用与Spring相同。
在一般情况下,最好注入EntityManager
,因为和一起EntityManagerFactory
,@PersistenceUnit
您也应该EntityManager
每次都手动创建/销毁并管理事务。
CDH报错:PersistenceException: [PersistenceUnit: cmf.server] Unable to build EntityManagerFactory
1.在启动CDH中master的服务cloudera-scm-server start并立刻挂掉了,提示如下错误
org.springframework.beans.factory.BeanCreationException: Error creating bean with name ''com.cloudera.server.cmf.TrialState'': Cannot resolve reference to bean ''entityManagerFactoryBean'' while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name ''entityManagerFactoryBean'': FactoryBean threw exception on object creation; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: cmf.server] Unable to build EntityManagerFactory
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:328)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:106)
at org.springframework.beans.factory.support.ConstructorResolver.resolveConstructorArguments(ConstructorResolver.java:616)
at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:148)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1003)
2.问题出现的原因,是因为连接到mysql的scm库出错了。
①首先查看连接到mysql的scm库的配置文件db.properties是否正常。
一般情况下位置在 /opt/cm-5.16.1/etc/cloudera-scm-server
②看看里面的配置是否正确
# The database type
# Currently ''mysql'', ''postgresql'' and ''oracle'' are valid databases.
com.cloudera.cmf.db.type=mysql
# The database host
# If a non standard port is needed, use ''hostname:port''
com.cloudera.cmf.db.host=localhost #ip和端口
# The database name
com.cloudera.cmf.db.name=scm #库名
# The database user
com.cloudera.cmf.db.user=scm #库用户,要在数据库中确认一下用户权限
# The database user''s password
com.cloudera.cmf.db.password=scm #库密码
# The db setup type
# By default, it is set to INIT
# If scm-server uses Embedded DB then it is set to EMBEDDED
# If scm-server uses External DB then it is set to EXTERNAL
com.cloudera.cmf.db.setupType=INIT #master为EXTERNAL,slave为INIT
③其实最好的测试办法,就是直接使用用户名和密码登录mysql看看是否能正常访问scm库。
3.重启master后可用了。
slave可能会出现下面报错:nested exception is java.lang.RuntimeException: ScmActive at bootup: Failed to validate the identity of Cloudera Manager.
在下一篇《CDH报错:ScmActive at bootup: Failed to validate the identity of Cloudera Manager.》中进行解决。
以上。
Exception in thread "AWT-EventQueue-0" javax.persistence.PersistenceException: No Persi...
swing
Exception in thread "AWT-EventQueue-0" javax.persistence.PersistenceException: No Persistence provider for EntityManager named null
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:61)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:39)
at com.hs.selenium.MainFrame.initComponents(MainFrame.java:49)
at com.hs.selenium.MainFrame.<init>(MainFrame.java:30)
at com.hs.selenium.MainFrame$2.run(MainFrame.java:198)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
glassfish +jersey 用 @PersistenceContext 无法获得注入的 EntityManager
配置如下
<?xml version="1.0" encoding="UTF-8"?> <persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> <persistence-unit name="core" transaction-type="JTA"> <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> <jta-data-source>core_test</jta-data-source> <exclude-unlisted-classes>false</exclude-unlisted-classes> <properties> <property name="eclipselink.ddl-generation" value="none"/> </properties> </persistence-unit> </persistence>
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE resources PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Resource Definitions//EN" "http://glassfish.org/dtds/glassfish-resources_1_5.dtd"> <resources> <jdbc-connection-pool allow-non-component-callers="false" associate-with-thread="false" connection-creation-retry-attempts="0" connection-creation-retry-interval-in-seconds="10" connection-leak-reclaim="false" connection-leak-timeout-in-seconds="0" connection-validation-method="auto-commit" datasource-classname="oracle.jdbc.pool.OracleDataSource" fail-all-connections="false" idle-timeout-in-seconds="300" is-connection-validation-required="false" is-isolation-level-guaranteed="true" lazy-connection-association="false" lazy-connection-enlistment="false" match-connections="false" max-connection-usage-count="0" max-pool-size="32" max-wait-time-in-millis="60000" name="oracle-thin_corePool" non-transactional-connections="false" pool-resize-quantity="2" res-type="javax.sql.DataSource" statement-timeout-in-seconds="-1" steady-pool-size="8" validate-atmost-once-period-in-seconds="0" wrap-jdbc-objects="false"> <property name="serverName" value="10.1.20.25"/> <property name="portNumber" value="1521"/> <property name="databaseName" value="pp"/> <property name="User" value="core"/> <property name="Password" value="core"/> <property name="URL" value="jdbc:oracle:thin:@10.1.20.25:1521:pp"/> <property name="driverClass" value="oracle.jdbc.OracleDriver"/> </jdbc-connection-pool> <jdbc-resource enabled="true" jndi-name="core_test" object-type="user" pool-name="oracle-thin_corePool"/> </resources>程序如下 返 回的
EntityManager为空
@Stateless public class UserJpaController implements Serializable { @Resource private UserTransaction utx; // @PersistenceContext(unitName="core") // private EntityManagerFactory emf; @PersistenceContext(unitName="core") private EntityManager iem; public EntityManager getEntityManager() { // return emf.createEntityManager(); System.out.println("iem is " + iem); return iem; }
javax.persistence.PersistenceContextType的实例源码
/** * Resolve the object against the application context. */ @Override protected Object getResourcetoInject(Object target,String requestingBeanName) { // Resolves to EntityManagerFactory or EntityManager. if (this.type != null) { return (this.type == PersistenceContextType.EXTENDED ? resolveExtendedEntityManager(target,requestingBeanName) : resolveEntityManager(requestingBeanName)); } else { // OK,so we need an EntityManagerFactory... return resolveEntityManagerFactory(requestingBeanName); } }
public EntityManager createEntityManager(Map map) { //Todo support discardOnClose,persistencecontexttype?,interceptor,return new EntityManagerImpl( this,PersistenceContextType.EXTENDED,transactionType,discardOnClose,sessionInterceptorClass,map ); }
/** * Resolve the object against the application context. */ @Override protected Object getResourcetoInject(Object target,so we need an EntityManagerFactory... return resolveEntityManagerFactory(requestingBeanName); } }
@PersistenceContext(type = PersistenceContextType.EXTENDED) public void setEntityManager(EntityManager em) { if (this.em != null) { throw new IllegalStateException("Already called"); } this.em = em; }
private EntityManager getEntityManager(final ExecutionContext context,final EntityManagerFactory emf) { EntityManager em = null; if (getPersistenceContextType(context) == PersistenceContextType.EXTENDED) { // EntityManager may be already open. If so use it. em = (EntityManager) context.getData(Constants.KEY_ENTITY_MANAGER); } if (em == null) { // create EntityManager and inject it em = emf.createEntityManager(); } return em; }
@Override public void afterTest(final TestInvocation invocation) throws Exception { final ExecutionContext context = invocation.getContext(); final EntityManager em = (EntityManager) context.getData(Constants.KEY_ENTITY_MANAGER); if (em != null && getPersistenceContextType(context) != PersistenceContextType.EXTENDED) { context.storeData(Constants.KEY_ENTITY_MANAGER,null); em.close(); } }
@Bean @PersistenceContext(type = PersistenceContextType.EXTENDED) public SessionFactory sessionFactory() { LocalSessionFactoryBuilder builder = new LocalSessionFactoryBuilder(dataSource()); builder.scanPackages("org.proflr.server.entity").addProperties(getHibernateProperties()); return builder.buildSessionFactory(); }
/** * Resolve the object against the application context. */ @Override protected Object getResourcetoInject(Object target,so we need an EntityManagerFactory... return resolveEntityManagerFactory(requestingBeanName); } }
@PersistenceContext(type = PersistenceContextType.EXTENDED) public void setEntityManager(EntityManager em) { if (this.em != null) { throw new IllegalStateException("Already called"); } this.em = em; }
private InjectionPoint persistenceContext(String unitName) { final InjectionPoint ip = mock(InjectionPoint.class); final Annotated annotated = mock(Annotated.class); when(ip.getAnnotated()).thenReturn(annotated); final PersistenceContext annotation = new PersistenceContext() { @Override public Class<? extends Annotation> annotationType() { return null; } @Override public String name() { return null; } @Override public String unitName() { return unitName; } @Override public PersistenceContextType type() { return null; } @Override public SynchronizationType synchronization() { return null; } @Override public PersistenceProperty[] properties() { return new PersistenceProperty[0]; } }; when(annotated.getAnnotation(PersistenceContext.class)).thenReturn(annotation); return ip; }
@Override @PersistenceContext(unitName="unit2",type = PersistenceContextType.EXTENDED) public void setEntityManager(EntityManager em) { super.setEntityManager(em); }
private PersistenceContextType getPersistenceContextType(final ExecutionContext context) { final Field field = context.getPersistenceField(); final PersistenceContext pc = field.getAnnotation(PersistenceContext.class); return pc.type(); }
@Override public PersistenceContextType type() { return PersistenceContextType.TRANSACTION; }
public EntityManagerImpl(EntityManagerFactoryImpl entityManagerFactory,PersistenceContextType pcType,SynchronizationType synchronizationType,PersistenceUnitTransactionType transactionType,boolean discardOnClose,Class sessionInterceptorClass,Map properties) { super(entityManagerFactory,pcType,synchronizationType,properties); }
@Override @PersistenceContext(unitName="unit2",type = PersistenceContextType.EXTENDED) public void setEntityManager(EntityManager em) { super.setEntityManager(em); }
@PersistenceContext(name = "method",unitName = "mu",type = PersistenceContextType.EXTENDED,properties = { @PersistenceProperty(name = "method1",value = "m1"),@PersistenceProperty(name = "method2",value = "m2") }) public void method() { }
@PersistenceContext(unitName = "mymu",properties = { @PersistenceProperty(name = "myMethod1",value = "mym1"),@PersistenceProperty(name = "myMethod2",value = "mym2") }) public void setMyMethod() { }
关于PersistenceUnit与PersistenceContext的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于CDH报错:PersistenceException: [PersistenceUnit: cmf.server] Unable to build EntityManagerFactory、Exception in thread "AWT-EventQueue-0" javax.persistence.PersistenceException: No Persi...、glassfish +jersey 用 @PersistenceContext 无法获得注入的 EntityManager、javax.persistence.PersistenceContextType的实例源码的相关知识,请在本站寻找。
本文标签: