# Problem mit JPA - OneToMany-Relation



## Meisi (8. Sep 2011)

Hallo !!!

Ich habe zwei Klassen *Terminal* und *Measurement*.
Die Beziehung ist 1...n (bi-direktional).

In meiner Datenbank befindet sich genau ein Terminal und genau eine, diesem Terminal zugeordnete, Measurement.
Nun möchte ich eine neue Measurement zu dem bestehenden Terminal hinzufügen.

Deswegen lasse ich mir zuerst über eine query das Terminal ausgeben. Dann weise ich der neuen Measurement das ausgegebene Terminal zu und persiste sie.

Und nun passiert, was nicht passieren soll. Es wird in der Datenbank zu dem bereits bestehenden noch ein neues Terminal erstellt, wobei sich die beiden nur im Primärschlüssel unterscheiden. 

Am Ende habe ich also 2 Terminals denen jeweils eine Measurement zugeordnet ist.
Wie bekomme ich das nun hin, dass ich am Ende 1 Terminal und 2 Measurements habe? 

Über Hilfe würd ich mich riesig freuen!!!

Hier noch die passenden Codeausschnitte:
*Klasse: Terminal*

```
@Entity
public class Terminal implements Serializable {
...
@Id
@GeneratedValue (strategy=SEQUENCE, generator = "IO_MRID")
@SequenceGenerator(allocationSize = 1, name = "IO_MRID", sequenceName = "MRID_SEQ")
private Integer mRID;
...
@OneToMany (cascade=CascadeType.ALL, targetEntity = Measurement.class , mappedBy = "Terminal")
	private List<Measurement>  Measurements = new Vector<Measurement>();
...
```
*Klasse: Measurement*
...

```
@Entity
public class Measurement implements Serializable {
...
@Id
@GeneratedValue (strategy=SEQUENCE, generator = "IO_MRID")
@SequenceGenerator(allocationSize = 1, name = "IO_MRID", sequenceName = "MRID_SEQ")
private Integer mRID;
...
@JoinColumn(name = "Terminal_CID")
@ManyToOne (cascade=CascadeType.ALL, targetEntity = Terminal.class) 
private Terminal Terminal;
...
```
*EntityManager*

```
...
EntityManagerFactory emf = new JPARessourceBean().getEMF(); 
EntityManager em = (EntityManager) emf.createEntityManager(); 

Measurement meas2 = new Measurement();
Terminal terminal;

Query query = em.createQuery("SELECT t FROM Terminal t");

terminal = query.getResultList().get(0); //gibt nur eins

em.getTransaction().begin();
		
meas2.setTerminal(terminal);

em.persist(meas2);
		
em.getTransaction().commit(); 

em.close();
emf.close();

...
```


----------



## nrg (8. Sep 2011)

Meisi hat gesagt.:


> Es wird in der Datenbank zu dem bereits bestehenden noch ein neues Terminal erstellt, wobei sich die beiden nur im Primärschlüssel unterscheiden.



???:L anderer primärschlüssel bedeutet andere entity


----------



## Meisi (8. Sep 2011)

Jedes Objekt in der Datenbank hat ja einen Primärschlüssel, aber ich will ja dass gar nicht erst ein neues Terminal-Objekt eingetragen wird, sonder der neue Measurementeintrag ganz einfach auf den Primärschlüssel des bestehenden Terminal-Objekts verweist


----------



## Meisi (8. Sep 2011)

also anderer primärschlüssel bedeutet andere instanz eines entity! oder ???


----------

