gpt4 book ai didi

java - 将实体列表添加到具有 @OneToMany 的实体时出现 JPA 空指针异常

转载 作者:行者123 更新时间:2023-11-30 06:26:01 24 4
gpt4 key购买 nike

我遇到以下问题。我使用 Wildfly 11 作为我的 Java EE 服务器。我有一个客户实体,其中包含地址实体列表。当我尝试为我的客户设置地址列表时,出现 NullPointerException

我的地址实体:

@Entity
public class Address {

@Id
@GeneratedValue
private long id;

private String street;
private String houseNumber;

@ManyToOne
@JoinColumn
private Customer customer;
-- constructor, getters, setters --

我的客户可以有多个地址:

@Entity
public class Customer {

@Id
@GeneratedValue
private long id;

private String name;

@OneToMany(mappedBy="customer")
private List<Address> adresses;
-- constructor, getters, setters --

我还有一个启动 bean,它尝试创建地址,并将客户地址添加到客户地址列表中并保留客户。

它的样子是这样的:

@Startup
@Singleton
public class StartupBean {

@PersistenceContext
private EntityManager em;

@PostConstruct
private void init () {
Address address = new Address();
address.setStreet("Example Street");
address.setHouseNumber("123");

Customer customer = new Customer();
customer.setName("Bob");
customer.getAdresses().add(address);
address.setCustomer(customer);

em.persist(customer);
}

现在,当我尝试将项目部署到 Wildfly 11 时,我在这一行收到 NullPointerException:customer.getAdresses().add(address);

这是完整的堆栈跟踪:01:00:26,529 错误 [org.jboss.msc.service.fail](ServerService 线程池

-- 210) MSC000001: Failed to start service jboss.deployment.subunit."my_project-ear.ear"."my_project-ejb-0.0.1-SNAPSHOT.jar".component.StartupBean.START: org.jboss.msc.service.StartException in service jboss.deployment.subunit."my_project-ear.ear"."my_project-ejb-0.0.1-SNAPSHOT.jar".component.StartupBean.START: java.lang.IllegalStateException: WFLYEE0042: Failed to construct component instance
at org.jboss.as.ee.component.ComponentStartService$1.run(ComponentStartService.java:57)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
at org.jboss.threads.JBossThread.run(JBossThread.java:320)
Caused by: java.lang.IllegalStateException: WFLYEE0042: Failed to construct component instance
at org.jboss.as.ee.component.BasicComponent.constructComponentInstance(BasicComponent.java:163)
at org.jboss.as.ee.component.BasicComponent.constructComponentInstance(BasicComponent.java:134)
at org.jboss.as.ee.component.BasicComponent.createInstance(BasicComponent.java:88)
at org.jboss.as.ejb3.component.singleton.SingletonComponent.getComponentInstance(SingletonComponent.java:124)
at org.jboss.as.ejb3.component.singleton.SingletonComponent.start(SingletonComponent.java:138)
at org.jboss.as.ee.component.ComponentStartService$1.run(ComponentStartService.java:54)
... 6 more
Caused by: javax.ejb.EJBException: java.lang.NullPointerException
at org.jboss.as.ejb3.tx.CMTTxInterceptor.handleExceptionInOurTx(CMTTxInterceptor.java:188)
at org.jboss.as.ejb3.tx.CMTTxInterceptor.invokeInOurTx(CMTTxInterceptor.java:277)
at org.jboss.as.ejb3.tx.CMTTxInterceptor.requiresNew(CMTTxInterceptor.java:354)
at org.jboss.as.ejb3.tx.LifecycleCMTTxInterceptor.processInvocation(LifecycleCMTTxInterceptor.java:74)
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
at org.jboss.as.weld.injection.WeldInjectionContextInterceptor.processInvocation(WeldInjectionContextInterceptor.java:43)
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
at org.jboss.as.ejb3.component.interceptors.CurrentInvocationContextInterceptor.processInvocation(CurrentInvocationContextInterceptor.java:41)
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
at org.jboss.as.ee.concurrent.ConcurrentContextInterceptor.processInvocation(ConcurrentContextInterceptor.java:45)
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
at org.jboss.invocation.ContextClassLoaderInterceptor.processInvocation(ContextClassLoaderInterceptor.java:60)
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
at org.jboss.as.ejb3.component.singleton.StartupCountDownInterceptor.processInvocation(StartupCountDownInterceptor.java:25)
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:53)
at org.jboss.as.ee.component.BasicComponent.constructComponentInstance(BasicComponent.java:161)
... 11 more
Caused by: java.lang.NullPointerException
at com.example.test.businesslogic.StartupBean.init(StartupBean.java:34)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.jboss.as.ee.component.ManagedReferenceLifecycleMethodInterceptor.processInvocation(ManagedReferenceLifecycleMethodInterceptor.java:96)
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
at org.jboss.as.weld.interceptors.Jsr299BindingsInterceptor.doLifecycleInterception(Jsr299BindingsInterceptor.java:122)
at org.jboss.as.weld.interceptors.Jsr299BindingsInterceptor.processInvocation(Jsr299BindingsInterceptor.java:111)
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
at org.jboss.invocation.InterceptorContext$Invocation.proceed(InterceptorContext.java:509)
at org.jboss.weld.ejb.AbstractEJBRequestScopeActivationInterceptor.aroundInvoke(AbstractEJBRequestScopeActivationInterceptor.java:73)
at org.jboss.as.weld.ejb.EjbRequestScopeActivationInterceptor.processInvocation(EjbRequestScopeActivationInterceptor.java:89)
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
at org.jboss.as.weld.injection.WeldInjectionInterceptor.processInvocation(WeldInjectionInterceptor.java:53)
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
at org.jboss.as.ee.component.ManagedReferenceFieldInjectionInterceptorFactory$ManagedReferenceFieldInjectionInterceptor.processInvocation(ManagedReferenceFieldInjectionInterceptorFactory.java:107)
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
at org.jboss.as.ee.component.AroundConstructInterceptorFactory$1.processInvocation(AroundConstructInterceptorFactory.java:28)
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
at org.jboss.as.weld.injection.WeldInterceptorInjectionInterceptor.processInvocation(WeldInterceptorInjectionInterceptor.java:56)
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
at org.jboss.as.weld.interceptors.Jsr299BindingsCreateInterceptor.processInvocation(Jsr299BindingsCreateInterceptor.java:105)
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
at org.jboss.as.ee.component.NamespaceContextInterceptor.processInvocation(NamespaceContextInterceptor.java:50)
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
at org.jboss.as.ejb3.tx.CMTTxInterceptor.invokeInOurTx(CMTTxInterceptor.java:275)
... 26 more

最佳答案

您收到空指针异常,因为您尝试添加到的地址列表不存在。你必须先初始化它。另外,List 是 Java 中的一个接口(interface)。您需要实例化 List 接口(interface)的实现。

因此,您应该拥有:

,而不是 address.setCustomer(customer);
    List<Address> addresses = new ArrayList<>();
addresses.add(address);
customer.setAdresses(addresses);

还有一件事。这样您就不会保留您的地址条目。您将只有客户。而且您不会遇到任何异常,因为 FOREIGN_KEY 位于您映射实体的方式的 Address 一侧(游览 @JoinColumn 注释位于关系的 Address 一侧)。

为了成功地保存两个实体,您需要像这样保存它们。

em.persist(address);
em.persist(customer);

持久化的顺序并不重要,因为您使用 Java EE,并且应用程序服务器负责处理事务,因此直到代码结束时它才会真正提交事务,但我认为这更重要按此顺序持久保存实体是合乎逻辑的。

您可以通过在地址列表上的 @OneToMany 注释上使用 cascade=CascadeType.ALL 属性来避免 em.persist(address);

所以,它会是:@OneToMany(mappedBy="customer",cascade=CascadeType.ALL)

这样,当您保留客户时,地址也会保留。

关于java - 将实体列表添加到具有 @OneToMany 的实体时出现 JPA 空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47191639/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com