注入 hibernate PersistenceUnit
Inject hibernate PersistenceUnit
通过使用 CDI,如下一个代码所示:
@PersistenceUnit
EntityManagerFactory emf;
我想注入我的休眠EntityManagerFactory
目前如果我执行下一行:
EntityManagerFactory emf = Persistence.createEntityManagerFactory("HibernatePersistanceProv");
它按预期工作,但如果我使用第一种方法执行它,它会尝试使用 Derby 连接 我知道这一点,因为我收到下一条错误消息:
org.hibernate.exception.GenericJDBCException: Unable to acquire JDBC Connection
通过堆栈跟踪我知道它是因为这个引起的。
Error connecting to server localhost on port 1527 with message Connection refused.
我知道这是因为它正在尝试连接到 (Java DB) Derby db。
我的 persistance.xml 看起来像这样:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="HibernatePersistanceProv" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="hibernate.connection.username" value="root"/>
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/aschema"/>
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
<property name="hibernate.connection.username" value="root"/>
<property name="hibernate.connection.password" value=""/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="false"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/aschema"/>
<property name="javax.persistence.jdbc.user" value="root"/>
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
</properties>
</persistence-unit>
</persistence>
我读到显然我需要指定一个 standalone.xml
来提供不同的 <jta-data-source>
但它对我来说比它应该的更复杂一点(我不想追错误的兔子),我来自 Java EE 世界已有一段时间,所以我认为我自己对此是全新的(for dummies 解释受到广泛赞赏)。
(如果有帮助)我 运行 在 GlassFish 4.1 服务器上。请询问是否需要任何其他信息。
我认为你的问题与数据库有关,但对于注入 EntityManager,我通常会这样做:
public class EntityManagerFactoryProducer {
@Produces
@ApplicationScoped
public EntityManagerFactory create() {
return Persistence.createEntityManagerFactory("HibernatePersistanceProv");
}
public void destroy(@Disposes EntityManagerFactory factory) {
factory.close();
}
}
public class EntityManagerProducer {
@Inject
private EntityManagerFactory emf;
@Produces
@RequestScoped
public EntityManager create() {
return emf.createEntityManager();
}
public void destroy(@Disposes EntityManager em) {
em.close();
}
}
而不是简单地把它注入到你想要的地方。如果你有更多的数据库使用限定符结合注入。
@Inject
private EntityManager entityManager;
解决方案最终是我没有正确管理 Glassfish 中的连接池,以实现此行为(至少这是我发现的方式,但我很确定它们应该更多)你需要至:
玻璃鱼方:
- 在 "Common Tasks" 面板(管理员控制台 (Glasfish4) 的左侧)展开 JDBC。
- Select JDBC 连接池 并单击主(中央)顶部的 新建 按钮面板,继续为池配置数据库连接。
- 现在在前面提到的同一 JDBC 部分(左面板)select JDBC 资源(应该在 JDBC 连接池 的正上方)在那里你可以创建一个新资源,这样你就可以使用 CDI您选择的名称或像我一样,只需在 jdbc/__default 连接中配置它(正如您想象的那样,这是 Glassfish CDI 提供的默认连接名字space,给select你的连接池点击linkjdbc/__default就table 出现在主(中央)面板上,它将带您进入另一种形式,您可以在其中使用标记为 池名称的下拉列表: 到 select 您新配置的连接池,或您选择的一个;保存它,在主(中央)面板的左上角。
休眠端:
- 在
persistence.xml
中,您可以:
a) 确保您没有提供任何 <jta-data-source>
(您在 jdbc/__default 中配置的 IFF)
b) 提供 JNDI 名称(通常是您为 JDBC 资源 提供的名称(如果您创建了一个)或在对于默认连接 (jdbc/__default),您可以在编辑视图中看到 JDNI 名称(即:java:comp/DefaultDataSource)。
将其写入 persistence.xml 中的 <jta-data-source>
,它应该可以解决问题。
抱歉图文资源不足,稍后我会尝试添加。我希望它对你有用"anonymous reader"。
重要提示 我需要切换回 Glassfish 4(不是 4.1),因为 Glassfish 4.1 当前(截至 1 月 16 日)有一个错误,不允许您创建新的连接池。
通过使用 CDI,如下一个代码所示:
@PersistenceUnit
EntityManagerFactory emf;
我想注入我的休眠EntityManagerFactory
目前如果我执行下一行:
EntityManagerFactory emf = Persistence.createEntityManagerFactory("HibernatePersistanceProv");
它按预期工作,但如果我使用第一种方法执行它,它会尝试使用 Derby 连接 我知道这一点,因为我收到下一条错误消息:
org.hibernate.exception.GenericJDBCException: Unable to acquire JDBC Connection
通过堆栈跟踪我知道它是因为这个引起的。
Error connecting to server localhost on port 1527 with message Connection refused.
我知道这是因为它正在尝试连接到 (Java DB) Derby db。
我的 persistance.xml 看起来像这样:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="HibernatePersistanceProv" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="hibernate.connection.username" value="root"/>
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/aschema"/>
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
<property name="hibernate.connection.username" value="root"/>
<property name="hibernate.connection.password" value=""/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="false"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/aschema"/>
<property name="javax.persistence.jdbc.user" value="root"/>
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
</properties>
</persistence-unit>
</persistence>
我读到显然我需要指定一个 standalone.xml
来提供不同的 <jta-data-source>
但它对我来说比它应该的更复杂一点(我不想追错误的兔子),我来自 Java EE 世界已有一段时间,所以我认为我自己对此是全新的(for dummies 解释受到广泛赞赏)。
(如果有帮助)我 运行 在 GlassFish 4.1 服务器上。请询问是否需要任何其他信息。
我认为你的问题与数据库有关,但对于注入 EntityManager,我通常会这样做:
public class EntityManagerFactoryProducer {
@Produces
@ApplicationScoped
public EntityManagerFactory create() {
return Persistence.createEntityManagerFactory("HibernatePersistanceProv");
}
public void destroy(@Disposes EntityManagerFactory factory) {
factory.close();
}
}
public class EntityManagerProducer {
@Inject
private EntityManagerFactory emf;
@Produces
@RequestScoped
public EntityManager create() {
return emf.createEntityManager();
}
public void destroy(@Disposes EntityManager em) {
em.close();
}
}
而不是简单地把它注入到你想要的地方。如果你有更多的数据库使用限定符结合注入。
@Inject
private EntityManager entityManager;
解决方案最终是我没有正确管理 Glassfish 中的连接池,以实现此行为(至少这是我发现的方式,但我很确定它们应该更多)你需要至:
玻璃鱼方:
- 在 "Common Tasks" 面板(管理员控制台 (Glasfish4) 的左侧)展开 JDBC。
- Select JDBC 连接池 并单击主(中央)顶部的 新建 按钮面板,继续为池配置数据库连接。
- 现在在前面提到的同一 JDBC 部分(左面板)select JDBC 资源(应该在 JDBC 连接池 的正上方)在那里你可以创建一个新资源,这样你就可以使用 CDI您选择的名称或像我一样,只需在 jdbc/__default 连接中配置它(正如您想象的那样,这是 Glassfish CDI 提供的默认连接名字space,给select你的连接池点击linkjdbc/__default就table 出现在主(中央)面板上,它将带您进入另一种形式,您可以在其中使用标记为 池名称的下拉列表: 到 select 您新配置的连接池,或您选择的一个;保存它,在主(中央)面板的左上角。
休眠端:
- 在
persistence.xml
中,您可以: a) 确保您没有提供任何<jta-data-source>
(您在 jdbc/__default 中配置的 IFF) b) 提供 JNDI 名称(通常是您为 JDBC 资源 提供的名称(如果您创建了一个)或在对于默认连接 (jdbc/__default),您可以在编辑视图中看到 JDNI 名称(即:java:comp/DefaultDataSource)。 将其写入 persistence.xml 中的<jta-data-source>
,它应该可以解决问题。
抱歉图文资源不足,稍后我会尝试添加。我希望它对你有用"anonymous reader"。
重要提示 我需要切换回 Glassfish 4(不是 4.1),因为 Glassfish 4.1 当前(截至 1 月 16 日)有一个错误,不允许您创建新的连接池。