新建springboot項目時,entityManagerFactory報錯的解決
新建springboot項目entityManagerFactory報錯

解決辦法
1.查看注解引入是否正確,實體類和jpa的。
2.檢查包的引用是否有沖突
spring生成EntityManagerFactory三種方式
1.LocalEntityManagerFactoryBean
只是簡單環(huán)境中使用。它使用JPA PersistenceProvider自動檢測機制( according to JPA's Java SE bootstrapping ),并且大多數(shù)情況下,你只能定義一下persistence unit name
例如:
<beans> <bean id="myEmf" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean"> <property name="persistenceUnitName" value="myPersistenceUnit"/> </bean> </beans>
2.從JNDI獲取EntityManagerFactory
這個選項是當(dāng)你應(yīng)用發(fā)布在javaee5的服務(wù)器中。你可以參閱自己應(yīng)用服務(wù)器文檔,如何發(fā)布一個自定義的JPA provider到你的應(yīng)用服務(wù)器中。
例:
<beans> <jee:jndi-lookup id="myEmf" jndi-name="persistence/myPersistenceUnit"/> </beans>
當(dāng)javaee服務(wù)器啟動時,會自動檢測persistence units。實際上,是檢測應(yīng)用包中的META-INF/persistence.xml 文件和web.xml中的persistence-unit-ref,以及定義的environment naming。我理解就是JNDI的name。
一般應(yīng)用情景是:
在META-INF/persistence.xml中 使用<jta-data-source>java:/ MySqlDS</jta-data-source> 獲取容器發(fā)布的Datesource。
transactions是使用的javaee容器支持的JTA系統(tǒng),例如tomcat中,可以這樣
如果你的項目準(zhǔn)備部署在tomcat上,要支持jta,則需把相關(guān)的包放在tomcat/lib包下
1)jndi配置,可以把jndi的配置放置在 tomcat/conf/Catalina/域名(如localhost)/項目名.xml
文件的Context節(jié)點下,如下:
? ?<Resource name="" auth="Container" type="javax.sql.DataSource"? ? ? ? ?username=""? ? ? ? ?password="" ? ? ? ?driveClassName="oracle.jdbc.driver.OracleDriver"? ? ? ? ?url="" maxActive="45" maxIdle="25"/>
jndi也可以配置在server.xml,context.xml中
2)jta UserTransaction配置
在server.xml文件GlobalNamingResources節(jié)點下配置如下:
? ? <!-- Resource configuration for UserTransaction ? ? ? ? ?use JOTM --> ? ? <Resource name="UserTransaction" auth="Container" ? ? ? ? type="javax.transaction.UserTransaction" ? ? ? ? factory="org.objectweb.jotm.UserTransactionFactory" ? ? ? ? jotm.timeout="60"/>
然后在 項目名.xml 文件的context節(jié)點下加:
? ?<ResourceLink name="UserTransaction" ? ? ? ? ? ? global="UserTransaction" ? ? ? ? ? ? type="javax.transaction.UserTransaction"/>? ?
SPRING 僅僅做的是是把EntityManagerFactory通過依賴注入到應(yīng)用的object中。如果要管理事務(wù),則使用JtaTransactionManager。
3.LocalContainerEntityManagerFactoryBean
這個選項中,spring扮演了容器的角色。完全掌管JPA。
LocalContainerEntityManagerFactoryBean會根據(jù)persistence.xml創(chuàng)造一個PersistenceUnitInfo實現(xiàn)。
<beans> <bean id="myEmf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="dataSource" ref="someDataSource"/> <property name="loadTimeWeaver"> <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/> </property> </bean> </beans>
不是所有的JPA provider都需要load-time weaving。hibernate就不需要。呵呵。 <property name="loadTimeWeaver">這個就不是必須的了。。
Persistence.xml配置:
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0"> <persistence-unit name="myUnit" transaction-type="RESOURCE_LOCAL"> <mapping-file>META-INF/orm.xml</mapping-file> <exclude-unlisted-classes/> </persistence-unit> </persistence>
如何處理多個persistence units。spring提供了PersistenceUnitManager統(tǒng)一管理。
<bean id="pum" class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager"> <property name="persistenceXmlLocations"> <list> <value>org/springframework/orm/jpa/domain/persistence-multi.xml</value> <value>classpath:/my/package/**/custom-persistence.xml</value> <value>classpath*:META-INF/persistence.xml</value> </list> </property> <property name="dataSources"> <map> <entry key="localDataSource" value-ref="local-db"/> <entry key="remoteDataSource" value-ref="remote-db"/> </map> </property> <!-- if no datasource is specified, use this one --> <property name="defaultDataSource" ref="remoteDataSource"/> </bean> <bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="persistenceUnitManager" ref="pum"/> <property name="persistenceUnitName" value="myCustomUnit"/> </bean>
dataSources中的key是persistence.xml中配置的datasource名字,value-ref是spring管理的數(shù)據(jù)源。
另外:
EntityManagerFactory是線程安全的,但是EntityManager不是。
public class ProductDaoImpl implements ProductDao {
private EntityManagerFactory emf;
@PersistenceUnit
public void setEntityManagerFactory(EntityManagerFactory emf) {
this.emf = emf;
}
public Collection loadProductsByCategory(String category) {
EntityManager em = this.emf.createEntityManager();
try {
Query query = em.createQuery("from Product as p where p.category = ?1");
query.setParameter(1, category);
return query.getResultList();
}
finally {
if (em != null) {
em.close();
}
}
}
}這樣使用有個最大問題就是每次都要創(chuàng)建一個新的entityManager。那么該怎么辦?
你可以通過@PersistenceContext獲取一個transactional EntityManager("shared EntityManager")。為什么稱它為transactional?因為它是一個共享的以及線程安全的當(dāng)前的transactional EntityManager的一個代理。
public class ProductDaoImpl implements ProductDao {
@PersistenceContext
private EntityManager em;
public Collection loadProductsByCategory(String category) {
Query query = em.createQuery("from Product as p where p.category = :category");
query.setParameter("category", category);
return query.getResultList();
}
}結(jié)束了。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java使用Soap方式調(diào)用WebService接口代碼示例
Java調(diào)用WebService接口是指通過Java語言來訪問并與WebService進行交互,WebService是一種基于Web的服務(wù)架構(gòu),它通過標(biāo)準(zhǔn)的XML和HTTP協(xié)議來提供服務(wù),這篇文章主要給大家介紹了關(guān)于Java使用Soap方式調(diào)用WebService接口的相關(guān)資料,需要的朋友可以參考下2024-03-03
一文詳解Java中的可變對象(Mutable)與不可變對象(Immutable)
如何在 Java 中創(chuàng)建不可變對象?我以前以為所有對象都是不可變的,因為如果你改變一個 String 實例的內(nèi)容,它總是會創(chuàng)建一個新的 String 對象并指向該對象,在本文中,我不僅將分享在 Java 中Immutable的步驟,還將討論可變對象與不可變對象及其優(yōu)缺點2023-11-11
詳細(xì)聊一聊JavaWeb中的Request和Response
這篇文章主要給大家介紹了關(guān)于JavaWeb中Request和Response的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2023-02-02

