2016-12-14 151 views
0

我需要运行以下代码。 但是,孩子不是为父实体'Erfasser'创建的。 如果我注释掉这行erfasser.getErfasst()。add(neu),一切正常。JPA实体未存储OneToMany关系

@PostConstruct 
public void init() { 

    Erfasser erfasser = new Erfasser(); 
    erfasser.setEmail("[email protected]"); 
    erfasser.setPasswort("counting88"); 
    gesamtAnzahl.einfuegenErfasser(erfasser); 

    Erfasst neu = new Erfasst(); 
    neu.setDatum(new Date()); 
    neu.setJuristische(1); 
    neu.setNatuerliche(0); 

    gesamtAnzahl.einfuegen(neu); 

    erfasser.getErfasst().add(neu); 

    gesamtAnzahl.update(erfasser); 

} 

enter image description here

只有Erfasser本身被正确地存储在数据库中。

@Entity 
public class Erfasser implements Serializable { 

private static final long serialVersionUID = 1L; 

public Erfasser() { 
    super(); 
} 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private int erfasser_id; 

@Column(length = 50) 
@Email(message = "Inkorrekt EMail") 
private String email; 

@Column(length = 30) 
private String passwort; 

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
@JoinColumn(referencedColumnName = "erfasser_id", name = "erfasst_id_referenz") 
private List<Erfasst> erfasst; 

public int getErfasser_id() { 
    return erfasser_id; 
} 

public void setErfasser_id(int erfasser_id) { 
    this.erfasser_id = erfasser_id; 
} 

public String getEmail() { 
    return email; 
} 

public void setEmail(String email) { 
    this.email = email; 
} 

public String getPasswort() { 
    return passwort; 
} 

public void setPasswort(String passwort) { 
    this.passwort = passwort; 
} 

public List<Erfasst> getErfasst() { 
    return erfasst; 
} 

public void setErfasst(List<Erfasst> erfasst) { 
    this.erfasst = erfasst; 
} 

} 

在这里,我SessionBeans:

AnzahlErfasstGesamtLocal.java

@Local 
public interface AnzahlErfasstGesamtLocal { 

public abstract List<Integer> gesamt(); 

public abstract List<Erfasst> gesamtNatuerlich(); 

public abstract List<Erfasst> gesamtJuristisch(); 

public abstract void einfuegenErfasser(Erfasser e); 

public abstract void einfuegen(Erfasst e); 

public abstract void update(Erfasser e); 

public abstract void loeschen(Erfasst e); 
} 

AnzahlErfasstGesamt.java

@Stateless 
@LocalBean 
public class AnzahlErfasstGesamt implements AnzahlErfasstGesamtLocal { 

@PersistenceContext 
private EntityManager em; 

public AnzahlErfasstGesamt() { 
} 

@Override 
public List<Integer> gesamt() { 

    return null; 
} 

@Override 
public List<Erfasst> gesamtNatuerlich() { 
    try { 
     TypedQuery<Erfasst> q = em.createQuery(
       "SELECT COUNT(e) FROM Erfasst e WHERE e.natuerliche = 1 AND e.juristische = 0; ", Erfasst.class); 
     List<Erfasst> liste = q.getResultList(); 
     if (!liste.isEmpty()) { 
      return liste; 
     } else { 
      return null; 
     } 
    } catch (NoResultException e) { 
     return null; 
    } 
} 

@Override 
public List<Erfasst> gesamtJuristisch() { 
    try { 
     TypedQuery<Erfasst> q = em.createQuery(
       "SELECT COUNT(e) FROM Erfasst e WHERE e.juristische = 1 AND e.natuerliche = 0; ", Erfasst.class); 
     List<Erfasst> liste = q.getResultList(); 
     if (!liste.isEmpty()) { 
      return liste; 
     } else { 
      return null; 
     } 
    } catch (NoResultException e) { 
     return null; 
    } 
} 

@Override 
public void einfuegen(Erfasst e) { 
    em.persist(e); 

} 

@Override 
public void update(Erfasser e) { 
    em.merge(e); 

} 

@Override 
public void loeschen(Erfasst e) { 
    em.remove(em.merge(e)); 

} 

@Override 
public void einfuegenErfasser(Erfasser e) { 
    em.persist(e); 

} 

} 
+0

更多信息请询问。编辑问题,添加实体更新方法的源代码 –

+0

什么是“gesamtAnzahl”?服务? – jklee

+0

@jklee - 编辑我的代码 - 没有它的我的SessionBean –

回答

0

没有什么错JPA - 什么是错在外部代码(当然还有你对这个问题的描述)。例如,我看不到实际的erfasst列表的创建位置 - 如果einfuegenErfasser(无论这意味着什么)都没有发生,那么在尝试将元素添加到空列表时,您将得到NullPointerException。那会发生什么?

+0

这是正确的 - 完全einfuegenErfasser是一个方法在我的sessionBean –

0

问题是JPA实体设置和使用它的代码的组合。 JPA实体ErfasserCascadeType.ALL,因此gesamtAnzahl.update(erfasser);用它更新子实体erfasst。同时,您不会在neu实例上设置erfasser参考。您需要在gesamtAnzahl.update(erfasser);之前执行neu.setErfasser(erfasser)之间的操作。

在分离的关注点上,尽管我是德国人,然后是英国人,但使用德国本地人的名字让我的头脑疯狂。