我试图运行以下代码。 但是孩子并没有被创建给父母实体' Erfasser'。 如果我注释掉行erfasser.getErfasst()。add(neu)一切正常。
@PostConstruct
public void init() {
Erfasser erfasser = new Erfasser();
erfasser.setEmail("benjamin.koubik@auditweb.de");
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);
}
只有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)
JPA没有任何问题 - 外部代码出错(当然还有你对问题的描述)。例如,我没有看到创建实际erfasst
列表的位置 - 如果einfuegenErfasser
中没有任何操作(无论这意味着什么),那么在尝试将元素添加到空列表时会出现NullPointerException 。这是怎么回事?
答案 1 :(得分:0)
问题是JPA实体设置和使用它的代码的组合。 JPA实体CascadeType.ALL
具有gesamtAnzahl.update(erfasser);
,因此erfasst
会使用它更新子实体erfasser
。同时,您未在neu
实例上设置neu.setErfasser(erfasser)
引用。您需要在gesamtAnzahl.update(erfasser);
之前对行preg_match()
执行一些操作。
在分离的关注线上,使用原生的德语命名让我头脑发疯,尽管我更喜欢德语,然后是英语。