bam*_*010 33 java persistence jpa glassfish java-ee
在我正在使用.ear打包的Java EE 6应用程序中,我想创建一个可以从不同.jar文件中的组件访问的持久性单元.
但是,我不确定如何定义此持久性单元.使用@PersistenceContext注释,如果名称与本地persistence.xml文件中定义的持久性单元匹配,则查找仅成功.
是否可以引用外部持久性单元?
Pas*_*ent 47
以下是JPA 2.0规范的相关部分:
8.2持久性单位包装
...
持久性单元由
persistence.xml文件定义 .其META-INF目录包含该persistence.xml文件的jar文件或目录称为持久性单元的根.在Java EE环境中,持久性单元的根必须是以下之一:
- EJB-JAR文件
- WAR文件的WEB-INF/classes目录[80]
- WAR文件的WEB-INF/lib目录中的jar文件
- EAR库目录中的jar文件
- 应用程序客户端jar文件
除非持久性单元包含除EJB-JAR或WAR中包含的持久性类之外的持久性类,否则不要求将包含持久性单元的EJB-JAR或WAR文件打包在EAR中.见8.2.1.6节.
注意:Java Persistence 1.0支持在EAR的根目录中使用jar文件作为持久性单元的根.不再支持此用途. 对于这种情况,便携式应用程序应该使用EAR库目录.见[9].
持久性单元必须具有名称.必须在单个EJB-JAR文件中,单个WAR文件内,单个应用程序客户机jar内或EAR中定义任何给定名称的一个持久性单元.请参见第8.2.2节"持久性单元范围".
该
persistence.xml文件可用于在同一范围内指定多个持久性单元.在Java EE EAR级别定义的所有持久性类必须可由应用程序中的所有其他Java EE组件访问 - 即由应用程序类加载器加载 - 这样,如果相同的实体类由两个不同的Java EE组件引用(可能使用不同的持久性单元),引用的类是相同的相同类.
然后:
8.2.2持久性单位范围
EJB-JAR,WAR,应用程序客户机jar或EAR可以定义持久性单元.
使用
unitName注释元素或persistence-unit-name部署描述符元素引用持久性单元时,持久性单元的可见性范围由其定义点确定:
- 在EJB-JAR,WAR或应用程序客户机jar级别定义的持久性单元分别限定为该EJB-JAR,WAR或应用程序jar,并且对该jar或war中定义的组件可见.
- 在EAR级别定义的持久性单元通常对应用程序中的所有组件可见.但是,如果EAR中的EJB-JAR,WAR或应用程序jar文件定义了同名的持久性单元,那么在EAR级别定义的该名称的持久性单元将不会对该EJB定义的组件可见 - JAR,WAR或应用程序jar文件,除非持久性单元引用使用持久性单元名称
#语法指定路径名以消除引用的歧义.使用#语法时,路径名相对于引用应用程序组件jar文件.例如,语法../lib/persistenceUnitRoot.jar#myPersistenceUnit指的是一个持久性单元,其名称在name的name元素中指定persistence.xmlfile,ismyPersistenceUnit和为其持久化单元的根的相对路径名../lib/persistenceUnitRoot.jar.所述#语法可与两个可使用unitName注释元素或persistence-unit-name部署描述符元素来引用在EAR级别定义的持久性单元.你还需要在pu jar的清单中包含实体类jar http://wiki.eclipse.org/Packaging_and_Deploying_EclipseLink_JPA_Applications_(ELUG)
总而言之,您应该能够在EAR的顶层定义实体和持久性单元,并从其他模块中使用它们.
我只是不确定你理解你的尝试以及你面临的问题.
小智 14
可以通过将persistence.xml放在ear的lib目录中的jar文件中来解决该问题.
persistence.xml必须包含包含实体的jar文件.我不得不给出jar文件的相对路径.我的耳朵结构
|-ear--
|-lib--|... some libs ...
| |--my-persistence-xml.jar
|-ejb-with-entities1.jar
|-ejb-with-entities2.jar
Run Code Online (Sandbox Code Playgroud)
我的jboss 7.1.1的persistence.xml
<persistence-unit name="my-pu" transaction-type="JTA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>java:jboss/datasources/mypu</jta-data-source>
<jar-file>../ejb-with-entities1.jar</jar-file>
<jar-file>../ejb-with-entities1.jar</jar-file>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>
<property name="hibernate.hbm2ddl.auto" value="create-drop"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true" />
</properties>
</persistence-unit>
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助
一切你需要的
EAR +
|- META-INF +
| - persistence.xml
|- ejb1-module.jar
|- ejb2-module.jar
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
<persistence-unit name="my-persistence-unit">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>MyDataSource</jta-data-source>
<!-- Note: it's relative to `persistence-module.jar` file location in EAR -->
<jar-file>../ejb1-module.jar</jar-file>
<jar-file>../ejb2-module.jar</jar-file>
<properties>
...
</properties>
</persistence-unit>
</persistence>
Run Code Online (Sandbox Code Playgroud)
Glassfish的EAR布局示例:
EAR +
|- lib +
| |- core-module.jar
| \- persistence-module.jar +
| \- META-INF +
| \- persistence.xml
|- ejb1-module.jar
\- ejb2-module.jar
Run Code Online (Sandbox Code Playgroud)
EJB模块可以是jar存档或展开目录.
在这种情况下,您persistence.xml可能会像:
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
<persistence-unit name="my-persistence-unit">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>MyDataSource</jta-data-source>
<!-- Note: it's relative to `persistence-module.jar` file location in EAR -->
<jar-file>../ejb1-module.jar</jar-file>
<jar-file>../ejb2-module.jar</jar-file>
<properties>
<property name="hibernate.current_session_context_class" value="jta"/>
<property name="hibernate.id.new_generator_mappings" value="true"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQL82Dialect"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hibernate.hbm2ddl.auto" value="update"/>
</properties>
</persistence-unit>
</persistence>
Run Code Online (Sandbox Code Playgroud)
<jar-file>如果使用模块版本控制(例如ejb1-module-1.0-SNAPSHOT.jar),则必须更新引用.
带@MappedSuperclass注释和EntityManager注入的抽象对象可以放在任何外部jar中.这个罐子不需要提及persistence.xml.例如,您可以创建core-module.jar具有PersistableEntity.java:
public class PersistableEntity {
@Id
@GeneratedValue
private Long id;
public Long getId() { return id; }
public Integer getVersion() { return version; }
}
Run Code Online (Sandbox Code Playgroud)
而且PersistableEntityManager.java:
public class PersistableEntityManager<T extends PersistableEntity> {
@PersistenceContext
protected EntityManager em;
}
Run Code Online (Sandbox Code Playgroud)
这core-module.jar可以通过使用不同的持久化单元,将您的所有项目中使用.您只需继承您的实体和EJB并避免使用样板.查看github上的示例bilionix-core.
| 归档时间: |
|
| 查看次数: |
35690 次 |
| 最近记录: |