包括我在内的一些人一直在努力将来自不同模块(jar)的实体合并到一个持久性单元中(特别是使用JavaSE,例如JPA 2.0:自动将来自不同jar*的实体类添加到PersistenceUnit*).根据答案,没有简单的直接方法来做到这一点.解决方案之一是在单个持久性单元文件中列出所有jar中的所有类,但这并不是很优雅.我可能偶然发现了另一种方式.通常,我的所有实体类都使用注释进行映射.至于解决方案:persistence.xml可以包含多个XML映射文件,例如:
main.jar文件META-INF/persistence.xml中!
<persistence-unit name="PU" transaction-type="RESOURCE_LOCAL">
<mapping-file>META-INF/order-mappings.xml</mapping-file>
<mapping-file>META-INF/customer-mappings.xml</mapping-file>
</persistence-unit>
Run Code Online (Sandbox Code Playgroud)
映射文件可以放在不同的jar中.我注意到它们可能包含没有任何属性的<entity>元素,例如:
order.jar!META-INF /订单mappings.xml
<entity-mappings>
<entity class="com.company.Order"></entity>
</entity-mappings>
Run Code Online (Sandbox Code Playgroud)
即使映射文件没有映射任何属性,但无论如何都要考虑Java类中的注释,一切似乎都可以正常工作!这意味着只需通过包含来自特定JAR的XML映射文件,就可以轻松地将来自多个jar的实体包含到单个持久性单元中.
我的问题是:这是一个允许的JPA映射文件用法还是只是我的持久性提供程序(Hibernate)的副作用?
我有一个JavaEE项目,它使用多个持久性单元.有没有办法指定特定JPA实体所属的持久性单元?某些实体位于一个数据源中,而其他实体位于我的第二个数据源中.有没有办法区分使用注释的两个?
我们有一个应用程序,它有许多实体类,必须有两个表.表格相同,唯一的区别是名称.这里提供的常见解决方案是使用继承(映射的超类和每类表策略)或两个具有不同映射的持久性单元.我们使用后一种解决方案,应用程序是建立在这种方法之上的,所以它现在被认为是给定的.
EJB方法将在两个持久性上下文中进行更新,并且必须在一个事务中执行此操作.两个持久性上下文都具有相同的数据源,这是与Microsoft SQL Server数据库(2012版)的启用XA的连接.上下文之间的唯一区别是,有一个映射XML可以更改某些实体类的表名,从而适用于这些表.
其中一个架构主管希望看到XA事务被消除,因为它们会对数据库造成巨大的开销,并且显然也会使执行的查询的日志记录和分析更加困难,可能还会阻止一些预先准备好的语句缓存.我不知道所有的细节,但对于很多应用程序,我们已经成功地消除了XA.然而,对于这一个,我们目前不能因为两个持久化上下文.
在这种情况下是否有某种方法可以在没有XA的情况下以事务方式对两个上下文进行更新?如果是这样,怎么样?如果没有,是否可以使用一个持久化上下文进行架构或配置更改而不必转向两个表的子类?
我知道这些问题:是否可以在事务中使用多个持久性单元,而不是XA?和 两阶段提交的XA事务
在投票将其作为副本关闭之前,请注意情况不同.我们不像第一个问题那样处于只读状态,两个上下文都在同一个数据库上运行,我们只使用MSSQL而我们使用的是GlassFish,而不是Weblogic.
我使用JPA持久性作为我的数据模型,使用Eclipselink作为持久性提供程序.我有一个模块化(OSGi)应用程序,其中一个模块包含标准数据模型和一个自动包含包中所有实体的持久性单元.持久性提供程序位于另一个模块中,该模块运行良好.
现在我想要第三个模块将一些实体添加到持久性单元.我怎么做?我找到了这个解决方案,这似乎是Spring特有的,我没有使用它.该方法的摘要是编写一个后处理器,该处理器挂钩到持久性单元处理并手动合并文件中的<class>条目persistence.xml.
是否可以合并持久性单元?任何人都可以建议一个解决方法吗?
我试图在Glassfish上部署的Java EE应用程序中的同一事务中使用2个持久性单元.
这两个持久性单元在persistence.xml中定义,如下所示:
<persistence-unit name="BeachWater">
<jta-data-source>jdbc/BeachWater</jta-data-source>
...
<persistence-unit name="LIMS">
<jta-data-source>jdbc/BeachWaterLIMS</jta-data-source>
...
Run Code Online (Sandbox Code Playgroud)
这些持久性单元对应于我在Glassfish中定义的JDBC资源和连接池,如下所示(这里包括一个,因为两者在名称和数据库连接信息之外是相同的):
JDBC Resource:
JNDI Name: jdbc/BeachWaterLIMS
Pool Name: BEACHWATER_LIMS
Connection Pool:
Name: BEACHWATER_LIMS
Datasource Classname: com.microsoft.sqlserver.jdbc.SQLServerConnectionPoolDataSource
Resource Type: javax.sql.ConnectionPoolDataSource
Run Code Online (Sandbox Code Playgroud)
有3个无状态会话bean,LimsServiceBean,AnalysisServiceBean和AnalysisDataTransformationServiceBean.
以下是LimsServiceBean的相关摘录:
@PersistenceContext(unitName = "LIMS")
EntityManager em;
...
public ArrayList<Sample> getLatestLIMSData() {
Query q = em.createNamedQuery("Sample.findBySubTypeStatus");
return new ArrayList<Sample>(q.getResultList());
}
Run Code Online (Sandbox Code Playgroud)
来自AnalysisServiceBean:
@PersistenceContext(unitName = "BeachWater")
EntityManager em;
...
public ArrayList<AnalysisType> getAllAnalysisTypes() {
Query q = em.createNamedQuery("AnalysisType.findAll");
return new ArrayList<AnalysisType>(q.getResultList());
}
Run Code Online (Sandbox Code Playgroud)
并从AnalysisDataTransformationServiceBean:
@EJB
private AnalysisService analysisService;
@EJB
private LimsService limsService;
public void …Run Code Online (Sandbox Code Playgroud) transactions glassfish multiple-databases persistence-unit ejb-3.0
在使用struts2 ejb hibernate的Web应用程序中,是否可以告诉应用程序persistence.xml在部署时间内查找或创建特定持久性单元名称的实体,该实体是在文件中写入的?
我persistence.xml在jboss节点下有两个持久性单元和一个数据源(包括两个"local-tx-datasource")xml文件.
为了清楚,我的意思是,我试过这个;
@Entity
@PersistenceContext(unitName="MY JNDI NAME specified in persistence.xml")
public abstract class Vehicle {
Run Code Online (Sandbox Code Playgroud)
并没有工作..然后尝试了这等等..
@PersistenceContext(name="MY PERSISTENCE UNIT NAME specified in persistence.xml")
@PersistenceUnit(name="MY PERSISTENCE UNIT NAME specified in persistence.xml")
Run Code Online (Sandbox Code Playgroud)
而且我用"UnitName = .."而不是"name = .."尝试了上面这些,但是任何东西都适用于我......
[解决了]
<.exclude-unlisted-classes> true <./ exclude-unlisted-classes>解决了我的问题
我有一个包含持久性单元的Java Web应用程序.在此持久性单元中,我可以选择现有数据源或创建新数据源.当我在glassfish服务器上构建运行此Web应用程序时,数据源是在glassfish服务器中构建的.还会创建一个连接池.
我可以删除glassfish服务器上的数据源和/或连接池.这不会从Netbeans IDE中删除数据源.当我再次运行Web应用程序时,将重新创建数据源和连接池.
如何删除netbeans IDE中的数据源和连接池?我无法在任何地方找到此功能.
我想删除现有的数据源和连接池,因为我遇到了新的数据源/连接池问题.为了确保在数据源/连接池之间没有发生混淆,我想删除我不再使用的旧版本.
我们可以将多个JPA持久性单元指向同一个数据库,在不同的Java项目中同时部署在服务器上吗?同时我的意思是,不是在同一秒部署,而是部署在一起.我正在使用hsqldb数据库.
我正在为我的项目提供客户端 - 服务器模型.我有一个统一的数据库表,其中服务器填充数据,然后客户端访问不同项目中的数据.我可以通过服务器成功填充数据库.但是当我部署客户端项目时,数据库中的所有数据都会被删除.
我<property name="hibernate.hbm2ddl.auto" value="update" />用于两个持久性单元.
上一个问题的后续问题:使用Hibernate 4生成SQL DB创建脚本
目标是让命令行工具能够生成具有给定持久性单元的SQL模式的文件(类似于Hibernate Tools中存在的hibernatetool-hbm2ddl Ant任务).
根据我之前的问题的答案,这可以实现org.hibernate.tool.hbm2ddl.SchemaExport.
而不是将所有实体添加到Configuration(如上一个答案中所建议的)我想指定一个PersistenceUnit.
是否可以在Hibernate中添加持久性单元Configuration?
就像是
Properties properties = new Properties();
properties.put( "hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect" );
...
EntityManagerFactory entityManagerFactory =
Persistence.createEntityManagerFactory( "persistentUnitName", properties );
Configuration configuration = new Configuration();
... missing part ...
SchemaExport schemaExport = new SchemaExport( configuration );
schemaExport.setOutputFile( "schema.sql" );
...
Run Code Online (Sandbox Code Playgroud)
按照评论中的要求编辑样本persistence.xml.每个类都注明了@Entity
<persistence
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_1_0.xsd"
version="1.0"
>
<persistence-unit
name="doiPersistenceUnit"
transaction-type="JTA"
>
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>jdbc/doi</jta-data-source>
<class>ch.ethz.id.wai.doi.bo.Doi</class>
[...]
<class>ch.ethz.id.wai.doi.bo.DoiPool</class> …Run Code Online (Sandbox Code Playgroud) 背景:Jboss5.1,MySql 5.0
我已经尝试了很多可能性..一个简单@GeneratedValue或其他解决方案明确指定序列生成器,但也有相同的问题...有堆栈跟踪
22:00:53,334 INFO [STDOUT] Hibernate: insert into Lavoro (nome, userIDrichiedente, sede, stato) values (?, ?, ?, ?)
22:00:53,341 WARN [JDBCExceptionReporter] SQL Error: 1364, SQLState: HY000
22:00:53,342 ERROR [JDBCExceptionReporter] Field 'ID' doesn't have a default value
22:00:53,372 ERROR [[CreaLavoroServlet]] Servlet.service() for servlet CreaLavoroServlet threw exception
javax.ejb.EJBException: javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: could not insert: [org.swimv2.model.Lavoro]
at org.jboss.ejb3.tx.Ejb3TxPolicy.handleExceptionInOurTx(Ejb3TxPolicy.java:77)
at org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:83)
at org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:190)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
at org.jboss.aspects.tx.TxPropagationInterceptor.invoke(TxPropagationInterceptor.java:76)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
at org.jboss.ejb3.tx.NullInterceptor.invoke(NullInterceptor.java:42)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
at org.jboss.ejb3.security.Ejb3AuthenticationInterceptorv2.invoke(Ejb3AuthenticationInterceptorv2.java:186)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
at org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:41) …Run Code Online (Sandbox Code Playgroud) 我必须在我的应用程序(spring)中使用两个不同的数据库,使用Hibernate,Jpa.我想直接将不同的表定义到不同的数据源.所以我使用两个不同的持久性单元,我尝试使用
<property name="packagesToScan" value="it.two.app.domain.first" />
Run Code Online (Sandbox Code Playgroud)
和
<property name="packagesToScan" value="it.two.app.domain.second" />
Run Code Online (Sandbox Code Playgroud)
将不同的表放入不同的包中.但它不起作用.事实上,所有表都是第一个数据源.然后我试着写入持久化XML文件类的名称
<persistence-unit name="persistenceFirst" transaction-type="RESOURCE_LOCAL">
<class>it.two.app.domain.first.OneTable</class>
<exclude-unlisted-classes/>
</persistence-unit>
Run Code Online (Sandbox Code Playgroud)
和it.two.app.domain.second.OtherTable
但是当我运行Log时,表'firstDB.other-table'不存在,我用到了services文件中
@PersistenceContext(unitName ="persistenceFirst")
private EntityManager em;
Run Code Online (Sandbox Code Playgroud)
和
@PersistenceContext(unitName = "persistenceSecond")
EntityManager em;
Run Code Online (Sandbox Code Playgroud)
你有什么想法吗?Thi是数据源XML文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.1.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">
<!-- first datasource -->
<context:property-placeholder location="classpath:jdbc-first.properties"/>
<bean id="dataSourceFirst" class="org.apache.commons.dbcp.BasicDataSource"
p:driverClassName="${jdbc.driverClassName}" p:url="${jdbc.databaseurl}"
p:username="${jdbc.username}" p:password="${jdbc.password}" />
<!-- second datasource -->
<context:property-placeholder location="classpath:jdbc-second.properties"/>
<bean id="dataSourceSecond" class="org.apache.commons.dbcp.BasicDataSource"
p:driverClassName="${jdbc.driverClassName}" p:url="${jdbc.databaseurl}"
p:username="${jdbc.username}" p:password="${jdbc.password}" /> …Run Code Online (Sandbox Code Playgroud) 我在JPA/Hibernate配置中配置了两个持久性单元.现在我需要为每个持久性单元执行不同的import.sql.如何指定应为每个持久性单元执行哪个import.sql?根据Hibernate的文档,我应该将import.sql放在classpath中.如果我这样做,import.sql将在每个持久性单元上执行.我需要以某种方式为每个持久性单元指定不同的import.sql.
persistence-unit ×12
jpa ×9
hibernate ×5
java ×4
java-ee ×3
ejb-3.0 ×2
glassfish ×2
database ×1
datasource ×1
eclipselink ×1
hbm2ddl ×1
import ×1
javabeans ×1
jpa-2.0 ×1
mysql ×1
netbeans ×1
spring ×1
sql-server ×1
transactions ×1
xa ×1