2016-12-14 14 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自体はDBに正しく格納されています。

@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

詳細情報req。質問を編集し、エンティティのソースコードを追加する更新方法 –

+0

"gesamtAnzahl"とは何ですか?サービス? – jklee

+0

@jklee - 自分のコードを編集している - いいえ、私のSessionBean –

答えて

0

JPAは何も問題はありません - 何かが外部コードに間違っています(確かにあなたの問題の説明と一緒に)。たとえば、実際のerfasstリストが作成された場所がわかりません。einfuegenErfasserで何も起こらなければ、nullリストに要素を追加しようとするとNullPointerExceptionが発生します。それはどうなるの?

+0

それは正しい - 正確にeinfuegenErfasserは私のsessionBeanのメソッドです –

0

問題は、JPAエンティティの設定とそれを使用するコードの組み合わせです。 JPAエンティティErfasserにはCascadeType.ALLがあるため、gesamtAnzahl.update(erfasser);は子エンティティerfasstを更新します。同時に、neuインスタンスでerfasser参照を設定しないでください。あなたは何かをneu.setErfasser(erfasser)の前にgesamtAnzahl.update(erfasser);の前にする必要があります。

私はドイツ語を話していても英語の話し手ではあるが、ネイティブのドイツ語のネーミングを使用すると、私の頭が狂ってしまう。

関連する問題