# JPA, Primary Key wird nicht in relationstabelle erstellt



## shoehmi (18. Nov 2011)

hallo leute,

bin neuling im JPA bereich. Schreibe gerade eine Anwendung wo ich JPA verwende. Als Framework nutze ich "Play". Das Framework liefert eine Klasse "Model" die auf JPA/Hibernate aufbaut und einiges vereinfacht.

Mein Problem:

Ich habe probleme mit zwei Tabellen:
- PeriodicalPayment
- Transaction

Transaction speichert einfach nur Kontobewegungen aller Art.
PeriodicalPayment speichert Daueraufträge.

Da die Transactiontabelle unabhängig bleiben soll darf da kein PeriodicalPayment schlüssel rein.
Also brauch ich eine neue Tabelle die mir JPA automatisch erstellt über eine Relation.
Er legt mir auch eine Tabelle für die Realtion an aber leider ohne Primarykey. Und das meckert
mir MySQL an und ist auch nicht schön.


wie kann ich einen Primarykey definieren ohne eine extra Klasse "PeriodicalPaymentTransaction" zu benutzen???

Klasse PeriodicalPayment:


```
package models;

import play.*;
import play.db.jpa.*;

import javax.persistence.*;

import java.util.*;

@Entity
public class PeriodicalPayment extends Model {
	
    @ManyToOne
    public Account account;
    
    @OneToMany(cascade = CascadeType.ALL)
    public List<Transaction> transactions;
    
	public int amount;	
	public String currency;
	public Date startAt;
    public Date createdAt;		
    public int periodType;
    
    public PeriodicalPayment(Account account, int amount, String currency, Date startAt, int periodType ) {
        this.account = account;
    	this.transactions = new ArrayList<Transaction>();        
        this.amount = amount;
        this.currency = currency;
        this.startAt = startAt;
        this.createdAt = new Date();        
        this.periodType = periodType;	        
    }
    
}
```

Klasse Transaction:


```
package models;

import play.*;
import play.db.jpa.*;

import javax.persistence.*;

import java.util.*;

@Entity
public class Transaction extends Model {
	public int amount;	
	public String currency;
    public Date createdAt;		
    
    @ManyToOne
    public Account account;

    public Transaction(Account account, int amount, String currency) {
        this.account = account;
        this.amount = amount;
        this.currency = currency;
        this.createdAt = new Date();	        
    }
    
}
```

mfg


----------



## theCoon (7. Dez 2011)

Hi, 

also einen primarykey kannst du folgendermaßen definieren:

```
public class deineKlasse {
@Id
@Column (name = "deineKlasse_ID")
@Generatedvalue (strategy= "such dir eine aus")
private long id;
...
}
```

wenn du in beide klassen so einen primary key definiert hast, kannst du bei deiner liste transactions noch die 
@JoinTable Annotation hinzufügen, das sieht dann so aus:

```
@OneToMany(cascade = CascadeType.ALL)
@JoinTable(
   name = "irgendEinTabellenName",
   joincolumns= @JoinColumn(name = "PPID",referencedColumnName="PP_ID"), //das zweite ist der Columnname deiner Id
   inversejoincolumns=@JoinColumn(name ="TransactionID", referencedColumnName="Trans_ID"))
   public List<Transaction> transactions;
```

nur @JoinColumn anstatt @JoinTable würde denke ich auch gehen, aber JoinTable ist meiner meinung nach leichter lesbar da alle information dortstehen.

gruß


----------



## c2delegate (12. Dez 2011)

theCoon hat gesagt.:


> Hi,
> 
> also einen primarykey kannst du folgendermaßen definieren:
> 
> ...



Bääääm! Benutz bitte keine primitiven Datentypen! Hier im Bespiel 
	
	
	
	





```
private long id;
```
 sondern 
	
	
	
	





```
private Long id;
```


----------



## theCoon (12. Dez 2011)

c2delegate hat gesagt.:


> ```
> private Long id;
> ```



hmm in der docu auf Id (Java EE 6 ) steht das jeder primitive oder jede wrapper klasse benutzt werden darf. 

es wäre nett wenn du mir genauer erklären könntest wieso long weniger gut ist? ich hab bisher immer nur primitive genutzt, aber man lernt ja nie aus^^.

gruß


----------

