JPA实体未存储OneToMany关系

时间:2016-12-14 10:28:19

标签: jpa

我试图运行以下代码。 但是孩子并没有被创建给父母实体' 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);

}

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);

}

}

2 个答案:

答案 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()执行一些操作。

在分离的关注线上,使用原生的德语命名让我头脑发疯,尽管我更喜欢德语,然后是英语。