Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过JPA将记录插入数据库_Java_Jpa - Fatal编程技术网

Java 通过JPA将记录插入数据库

Java 通过JPA将记录插入数据库,java,jpa,Java,Jpa,在我的代码中,我使用JSF前端、EJB中间层和JPA连接到DB。使用Webservices调用EJB。使用MySQL作为数据库。 我已经创建了选民表,需要在其中插入记录。 我正在将值从JSF传递到EJB,它正在工作 例如:获取实体经理等 em = getEntityManager(); em.getTransaction().begin(); em.persist(voter); em.getTransaction().commit(); 我还创建了命名查询:

在我的代码中,我使用JSF前端、EJB中间层和JPA连接到DB。使用Webservices调用EJB。使用MySQL作为数据库。 我已经创建了选民表,需要在其中插入记录。 我正在将值从JSF传递到EJB,它正在工作 例如:获取实体经理等

    em = getEntityManager();
    em.getTransaction().begin();
    em.persist(voter);
    em.getTransaction().commit();
我还创建了命名查询:

@NamedQuery(name = "Voter.insertRecord", query = "INSERT INTO Voter v 
values v.voterID = :voterID,v.password = :password,v.partSSN = :partSSN,
v.address = :address, v.zipCode = :zipCode,v.ssn = :ssn, 
v.vFirstName = :vFirstName,v.vLastName = :vLastName,v.dob = :dob"),
但仍然无法插入记录

有人能帮我通过JPA(持久化对象)将记录插入数据库吗

更新: 如果我们正在使用容器管理的实体管理器,那么我们是否需要再次编写开始和提交事务。。。 像这样:

em.getTransaction().begin(); 
em.getTransaction().commit(); 
我写过:

Voter v= new Voter(voterID,password,partSSN,address,zipCode,ssn,vFirstName,vLastName,d1,voterFlag);
em.persist(v);
但它会导致空指针异常

SEVERE: java.lang.NullPointerException
    at ejb.Registration.reg(Registration.java:39)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1052)
    at org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1124)
    at com.sun.ejb.containers.BaseContainer.invokeTargetBeanMethod(BaseContainer.java:4038)
    at com.sun.ejb.containers.BaseContainer.__intercept(BaseContainer.java:5223)

我认为你没有抓住JPA的重点。使用JPA,您不需要编写查询来插入、更新或删除持久对象,JPA将为您生成它们。 因此,您需要做的是创建域对象并对其进行注释,使其“持久化”(此类注释对象称为实体),并告诉JPA引擎如何将其“映射”到数据库。让我试着告诉你正确的道路

首先,创建一个
投票者
域对象并添加JPA注释(实体类必须使用
实体
注释进行注释,必须具有无参数构造函数,必须实现
可序列化
,必须具有由
Id
注释标识的主键):

我在这里使用JPA的默认值(默认表名、列名等)。但是,如果需要将实体映射到现有模型,则可以使用
注释对其进行自定义

然后,创建一个新实例并设置各种属性:

Voter voter = new Voter();
voter.setFirstName(firstName);
voter.setLastName(lastName);
...
并坚持:

em.getTransaction().begin();
em.persist(voter);
em.getTransaction().commit();
这只是一个简短的介绍,JPA不能用一个答案来回答。为了更进一步,我建议查看JavaEE5教程中的


更新:在托管组件中,例如EJB,通常注入
EntityManager
,事务由容器管理(即,您不显式调用
开始/提交
)。在您的情况下,我打赌
EntityManager
没有成功注入,对其调用任何方法都会导致NPE。但这只是猜测,你需要提供更多细节。EJB的第39行是什么?
EntityManager
是如何注释的?您的
persistence.xml
看起来像什么?请使用相关详细信息更新您的问题。

我猜它没有从构造函数中插入的参数中检索的值,这会导致NullPointerExpection。最好使用voter.setPassword(password);例如,将值传递到投票者实体。还要检查这些值是否为空

此外,您不需要再次编写开始和提交事务。如下所示:

em.getTransaction().begin();
em.getTransaction().commit()


如果您正在使用容器管理的实体管理器,因为它是由容器自动完成的。

Pascal是正确的,您可以这样做。如果要使用命名查询,可以这样做:

em.getTransaction().begin(); 
em.getTransaction().commit(); 
编写一个接受要设置的值的方法并使用它

Query q  = em.createNamedQuery("NamedQueryXYZ").setParameter("parameter name", valueToSet)
参数名将使用您的示例“password”或“attribute”,基本上不管冒号后面是什么


我对JPA、JSF和所有jazz都相当陌生,但我希望这会有所帮助。

如果您使用实体管理器意味着您使用JTA处理事务,那么实体管理器将由容器处理,您将无法使用

 em.getTransaction().begin();
 em.getTransaction().commit();
em.getTransaction()
这是一个实体事务,将由JTA处理

您将需要直接使用
persist()
,因为您有entitymanager,并且您的数据将被添加

如果要使用查询,则始终可以在en.createQuery中使用该查询。。。
但我不知道它是否可以用作命名查询

ID字段上自动生成的注释是否意味着在创建新对象时不需要设置ID?我只是设置了所有其他非空字段并调用em.persist()函数,这就是?我知道这是一个愚蠢的问题,我只是Java开发的初学者