JPA Problem

Diskutiere JPA Problem im Developer Network Forum im Bereich Hardware & Software Forum; Hallo zusammen, bin mal gespannt, ob mir hier jemand bei meinem JPA Problem helfen kann (wem JPA nichts sagt, der kann mir schonmal nicht...
  • JPA Problem Beitrag #1
Okraml

Okraml

Bekanntes Mitglied
Dabei seit
02.11.1999
Beiträge
1.687
Reaktionspunkte
0
Ort
Ossi
Hallo zusammen,

bin mal gespannt, ob mir hier jemand bei meinem JPA Problem helfen kann (wem JPA nichts sagt, der kann mir schonmal nicht helfen ;))

Also folgendes:
Ich habe eine Klasse Spieler und eine Klasse Gebaeude.
Ein Spieler soll jetzt mehrere Gebäude haben können, also habe ich ne Liste in die Klasse Spieler aufgenommen:
Code:
private List<Gebaeude> gebaeude = new ArrayList<Gebaeude>();

im Getter habe ich jetzt sowohl
Code:
	@OneToMany
	public List<Gebaeude> getGebaeude() {
		return gebaeude;
	}
als auch
Code:
	@ManyToMany
	public List<Gebaeude> getGebaeude() {
		return gebaeude;
	}
versucht um auch mehrere identische Gebäude zu speichern (also mit gleichem Attribut id), aber da JPA in der Datenbank nur eine einfache Verknüpfungstabelle mit den beiden Spalten für die id's erstellt, kommt natürlich der Fehler:
Duplicate entry '1-1' for key 'PRIMARY'

Was muss ich ändern?

:) Okraml
 
  • JPA Problem Beitrag #2
FatherFrost

FatherFrost

Moderator
Teammitglied
Dabei seit
26.11.1999
Beiträge
4.710
Reaktionspunkte
3
Ort
NorthPole
habe ich es richtig verstanden, dass du eine m:n beziehung abbilden willst? bei dieser art beziehung braucht man 3 tabellen. auch bei jpa baucht man 3 klassen
 
  • JPA Problem Beitrag #3
Okraml

Okraml

Bekanntes Mitglied
Dabei seit
02.11.1999
Beiträge
1.687
Reaktionspunkte
0
Ort
Ossi
Es werden bereits 3 Tabellen erzeugt, allerdings besteht die Verknüpfungstabelle mir aus den beiden ID der anderen Tabellen, so dass keine Verbindung doppelt vorkommen kann. Es sollte doch reichen, wenn die Verknüpfungstabelle auch noch eine eigene ID-Spalte hat. Dann können auch mehrere verknüpfungen doppelt drin vorkommen.

:) Okraml
 
  • JPA Problem Beitrag #4
U

UnimatrixZero

Bekanntes Mitglied
Dabei seit
27.06.2001
Beiträge
645
Reaktionspunkte
0
Warum willst Du ein Gebäude mehrmals in die Liste packen? Ein Spieler kann ja das Gebäude nur einmal haben. Wenn Du meinst, dass ein Spieler meherer Gebäude gleichen Typs haben kann, dann wäre es besser, ein Attribut "Typ" in die Tabelle Gebäude mit aufzunehmen und jedem Gebäude dann eine eigene ID zuweisen lassen.
Damit ist die ID eindeutig und es gibt keinen Konflikt mehr. Das wäre dann aber eine 1:n Beziehung.
 
  • JPA Problem Beitrag #5
Okraml

Okraml

Bekanntes Mitglied
Dabei seit
02.11.1999
Beiträge
1.687
Reaktionspunkte
0
Ort
Ossi
Warum willst Du ein Gebäude mehrmals in die Liste packen? Ein Spieler kann ja das Gebäude nur einmal haben. Wenn Du meinst, dass ein Spieler meherer Gebäude gleichen Typs haben kann, dann wäre es besser, ein Attribut "Typ" in die Tabelle Gebäude mit aufzunehmen und jedem Gebäude dann eine eigene ID zuweisen lassen.
Damit ist die ID eindeutig und es gibt keinen Konflikt mehr. Das wäre dann aber eine 1:n Beziehung.

Sowas hab ich mir auch schon überlegt, vor allem da ich so zu jedem Spielergebäude auch noch zusätzliche Informationen speichern kann.

Danke erstmal euch beiden.
Dann werde ich mal weiterproggen und schauen, wann mein nächstes Problem auftaucht...

:) Okraml
 
  • JPA Problem Beitrag #6
Okraml

Okraml

Bekanntes Mitglied
Dabei seit
02.11.1999
Beiträge
1.687
Reaktionspunkte
0
Ort
Ossi
Habe jetzt das nächste Problem wieder mit den Gebäuden:

Habe noch ne Klasse RessourcenTyp und eine Klasse Ressource, welche ein Attribut RessourcenTyp hat.
Meine Gebäude sollen jetzt natürlich Ressourcen kosten, also hab ich ne List von Ressource-Objekten bei dem Gebäude rein gepackt.
Das sollte auch soweit passen (da JPA ne zusätzliche Tabelle Gebaeude_Ressource erstellt).
Jetzt will ich aber noch 2 weitere Listen mit Ressource-Objekten in Gebäude haben (einkommen und unterhalt). Diese werden aber nicht in einer eigenen Tabelle gespeichert, sondern in der gleichen. Kann ich irgendwie in meiner OneToMany-Annotation auch noch den Tabellennamen angeben, der dafür verwendet werden soll?

:) Okraml
 
  • JPA Problem Beitrag #7
Okraml

Okraml

Bekanntes Mitglied
Dabei seit
02.11.1999
Beiträge
1.687
Reaktionspunkte
0
Ort
Ossi
Nach weiterem Suchen und Probieren hab ich ne Lösung gefunden:
Code:
	@JoinTable(	name="GEB_RESBAU",
		joinColumns={ @JoinColumn(name="GEB_ID", referencedColumnName="ID") },
		inverseJoinColumns={ @JoinColumn(name="RES_ID", referencedColumnName="ID") }
	)

So kann ich die Tabelle festlegen, wie ich es benötige.

:) Okraml
 
  • JPA Problem Beitrag #8
Okraml

Okraml

Bekanntes Mitglied
Dabei seit
02.11.1999
Beiträge
1.687
Reaktionspunkte
0
Ort
Ossi
Und schon wieder habe ich ein Problem:

Diesmal mit den Klassen/Entitäten Spieler und Stadt:

Jeder Spieler ist einer Stadt zugeordnet und jede Stadt kann mehrere Spieler haben, daher habe ich in der Klasse Stadt:
Code:
	@OneToMany(mappedBy="home", cascade=CascadeType.ALL)
	private List<Spieler> bewohner = new ArrayList<Spieler>();
und in der KLasse Spieler:
Code:
	@ManyToOne
	private Stadt home;

Das funktioniert auch solange, bis ich der Stadt auch noch ein Attribut besitzer vom Typ Spieler geben will. Wenn ich dann einen Spieler lade, bekomme ich nen StackOverFlow-Error. Ich vermute mal, wenn JPA die Stadt lädt, wird auch der besitzer geladen und von dem dann die Stadt und davon dann der besitzer...

Jemand ne Idee für ne Lösung?

:) Okraml
 
  • JPA Problem Beitrag #9
ZockerM

ZockerM

Verdienter Ex-Mod
Dabei seit
25.11.2000
Beiträge
2.722
Reaktionspunkte
0
Ort
/root
Hallo,

spiel mal ein wenig mit "lazy-loading" herum. Dann sollte nicht versucht werden, ganze Objektgraphen zu laden.

gruß ZockerM
 
Thema:

JPA Problem

ANGEBOTE & SPONSOREN

https://www.mofapower.de/

Statistik des Forums

Themen
213.180
Beiträge
1.579.174
Mitglieder
55.879
Neuestes Mitglied
stonetreck
Oben