Java 如何使用JPA进行注射?
是否可以使用EclipseLink 2.3在EntityManager中进行注射 这是我的persistence.xml文件:Java 如何使用JPA进行注射?,java,eclipse,jakarta-ee,jpa,jpa-2.0,Java,Eclipse,Jakarta Ee,Jpa,Jpa 2.0,是否可以使用EclipseLink 2.3在EntityManager中进行注射 这是我的persistence.xml文件: <?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:schema
<?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="SuaParte" transaction-type="RESOURCE_LOCAL">
// classes..
<properties>
<property name="eclipselink.jdbc.batch-writing" value="JDBC"/>
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/schema"/>
<property name="javax.persistence.jdbc.user" value="root"/>
<property name="javax.persistence.jdbc.password" value="root"/>
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
</properties>
</persistence-unit>
</persistence>
<?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="SuaParte" transaction-type="JTA">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>jdbc/mysql</jta-data-source>
//classes..
</persistence-unit>
</persistence>
因此,我尝试在数据库中保留一些内容:
@Stateless
@LocalBean
public class DaoUser {
@PersistenceContext(unitName="SuaParte")
private EntityManager em;
public void persist(User user){
try{
em.persist(user);
}catch(Exception e){
e.printStackTrace();
}
}
}
在em.persist(user)中返回java.lang.NullPointerException
代码>。
我做错了什么?您必须将事务类型更改为JTA,如下所示-
<persistence-unit name="SuaParte" transaction-type="JTA">
<persistence-unit name="SuaParte" transaction-type="JTA">
<jta-data-source>JNDI_Name_Of_JDBC_Resource</jta-data-source>
您也可以在Servlet
和ManagedBean
中执行
另外,在您的Glassfish
服务器上,您可以创建JDBC连接池
和JDBC资源
,给它一个JNDI名称
,并使用它在persistence.xml
中声明您的EntityManager
,如下所示-
<persistence-unit name="SuaParte" transaction-type="JTA">
<persistence-unit name="SuaParte" transaction-type="JTA">
<jta-data-source>JNDI_Name_Of_JDBC_Resource</jta-data-source>
JNDI\u JDBC\u资源的名称
您可以从Glassfish管理控制台上创建JDBC资源
BheshG的答案很好,这里只是一些小的补充
- 我认为,为了激活CDI,从而进行依赖项注入,您需要创建一个空的beans.xml文件,必须将该文件放在项目的WEB-INF文件夹中
- 要在GF3中创建数据源并通过JNDI(如BheshG SAI)将其公开,您基本上必须做到:
- resources->JDBC->JDBC连接池并创建连接池
- 创建将使用该池的数据源
(我想为conenction pool和datasource发布带有示例的图像,但我不能,因为我没有信誉点。为了不显得垃圾和垃圾,我只想说:如果你想要更多细节或示例项目,请发电子邮件给我,因为我现在正在编写关于这方面的教程)
现在,您可以在persistence.xml文件中使用该数据源将其附加到持久化单元:
<persistence-unit name="emJTA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>jdbc/postgre_ds_jta</jta-data-source>
<mapping-file>META-INF/emp-mappings.xml</mapping-file>
<class>model.Employee</class>
<class>model.ProjectManager</class>
<class>model.Department</class>
<class>model.Project</class>
<class>model.Phone</class>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
<property name="hibernate.hbm2ddl.auto" value="update" />
</properties>
</persistence-unit>
org.hibernate.ejb.HibernatePersistence
jdbc/postgre\u ds\u jta
META-INF/emp-mappings.xml
模范员工
model.ProjectManager
模范部门
模型项目
型号.电话
使用@PersistenceContext
时有什么问题?你的问题并不完全清楚。如果您将事务类型更改为JTA
@BalusC,它在Glassfish中应该可以正常工作,我没有在Glassfish中创建连接池,我不知道我必须这样做。我已经按照Andrei说的做了,但是现在返回一个java.lang.NullPointerException。很可能您缺少CDI工作所需的一些依赖项。没有更多的细节很难说。如果你不想在glassfish中使用JPA2+EJB3+CDI,请在我更新我的帖子上查看我的小项目,你能看看我的新情况吗?谢谢伙计。安德烈,拜托伙计,帮帮我,我不知道你的电子邮件,没有在你的个人资料中找到,我真的需要一些帮助。你能帮我解决我的问题吗?我按照你和Andrei Bodnarescu说的做了,但仍然给出了java.lang.NullPointerException异常,我真的不知道为什么会发生这种情况,我花了两天时间在这个问题上,到目前为止什么都没有,你能帮我吗?