@Id über zwei Spalten

Status
Nicht offen für weitere Antworten.

mad-din

Bekanntes Mitglied
Hi!

Ich hab eine Tabelle, deren PrimaryKey aus zwei Spalten (brandid, keyword) besteht. Meine Entityclass benötigt jetzt natürlich noch die Annotation für die Id, aber wie mache ich das bei zwei Spalten? Problem ist zum Beispiel auch, dass in der Brand-Tabelle auch eine Liste mit den Keywords gehalten werden soll über @OneToMany. Da müsste ich dann auch noch beide Spalten angeben, aber das geht ja nicht, da in mappedBy immer nur eine Spalte angegeben werden kann.

So sieht meine Entity für die Tabelle 'brand' aus:

Code:
import java.util.Date;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table(name="brand")
public class Brand {

	@Id
	@GeneratedValue
	@Column(name="brandid")
	private Long brandId;
	@Column(name="name")
	private String name;
	@Column(name="customerid")
	private Long customerId;
	@Column(name="added")
	private Date added;
	@Column(name="lastupdate")
	private Date lastUpdate;
	@ManyToOne
	@JoinColumn(name="customerid", insertable=false, updatable=false)
	private Customer customer;
	@OneToMany(mappedBy="brandId,keyword")
	private List<Keyword> keywords;
	
	public Brand() {
	}

	/**
	 * @return the brandId
	 */
	public Long getBrandId() {
		return brandId;
	}

	/**
	 * @param brandId the brandId to set
	 */
	public void setBrandId(Long brandId) {
		this.brandId = brandId;
	}

	/**
	 * @return the name
	 */
	public String getName() {
		return name;
	}

	/**
	 * @param name the name to set
	 */
	public void setName(String name) {
		this.name = name;
	}

	/**
	 * @return the customerId
	 */
	public Long getCustomerId() {
		return customerId;
	}

	/**
	 * @param customerId the customerId to set
	 */
	public void setCustomerId(Long customerId) {
		this.customerId = customerId;
	}

	/**
	 * @return the added
	 */
	public Date getAdded() {
		return added;
	}

	/**
	 * @param added the added to set
	 */
	public void setAdded(Date added) {
		this.added = added;
	}

	/**
	 * @return the lastUpdate
	 */
	public Date getLastUpdate() {
		return lastUpdate;
	}

	/**
	 * @param lastUpdate the lastUpdate to set
	 */
	public void setLastUpdate(Date lastUpdate) {
		this.lastUpdate = lastUpdate;
	}

	/**
	 * @return the customer
	 */
	public Customer getCustomer() {
		return customer;
	}

	/**
	 * @param customer the customer to set
	 */
	public void setCustomer(Customer customer) {
		this.customer = customer;
	}

	/**
	 * @return the keywords
	 */
	public List<Keyword> getKeywords() {
		return keywords;
	}
		
}


und so die Entity für die Tabelle 'keyword':

Code:
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="keyword")
public class Keyword {
	
	@Id
	@Column(name="brandid")
	private Long brandId;
	@Column(name="keyword")
	private String keyword;
	@Column(name="status")
	private Integer status;
	@Column(name="created")
	private Date created;
	@Column(name="lastupdate")
	private Date lastUpdate;
	
	
	public Keyword() {
	}


	/**
	 * @return the brandId
	 */
	public Long getBrandId() {
		return brandId;
	}


	/**
	 * @param brandId the brandId to set
	 */
	public void setBrandId(Long brandId) {
		this.brandId = brandId;
	}


	/**
	 * @return the keyword
	 */
	public String getKeyword() {
		return keyword;
	}


	/**
	 * @param keyword the keyword to set
	 */
	public void setKeyword(String keyword) {
		this.keyword = keyword;
	}


	/**
	 * @return the status
	 */
	public Integer getStatus() {
		return status;
	}


	/**
	 * @param status the status to set
	 */
	public void setStatus(Integer status) {
		this.status = status;
	}


	/**
	 * @return the created
	 */
	public Date getCreated() {
		return created;
	}


	/**
	 * @param created the created to set
	 */
	public void setCreated(Date created) {
		this.created = created;
	}


	/**
	 * @return the lastUpdate
	 */
	public Date getLastUpdate() {
		return lastUpdate;
	}


	/**
	 * @param lastUpdate the lastUpdate to set
	 */
	public void setLastUpdate(Date lastUpdate) {
		this.lastUpdate = lastUpdate;
	}
	
}

Kann mir jemand helfen wie ich das Problem in den Griff kriege?

Danke & viele Grüße
Martin
 

bronks

Top Contributor
Ohne jetzt auf Einzelheiten einzugehen: Lad Dir Netbeans6.1 runter. Erstelle ein JavaProjekt und laß Dir auf Basis Deiner Datenbank von Netbeans die Entieties generieren. Sobald Du den Generierten Code siehst wird Dir alles klar sein.

Viel Erfolg.
 

kama

Top Contributor
Hallo,

meine Erste Frage lautet:

In welcher Beziehung stehen die Tabellen Brand und Keyword ? Bzw. deren Einträge?

Ein Brand hat einen oder mehrere Keyword's ? (1-zu-n) ?


Weitere Frage:
Warum hat die Tabelle Brand eine Spalte "brandId" anstatt "Id".
Warum hat die Tabelle Keyword eine Spalte "brandId" anstatt "Id".

Wichtige Regel: Jede Tabelle hat Ihre eigene Sequence bzw. Auto increment Spalte.

Verknüpfung per @OneToMany über eine entsprechenden FK_Spalte (z.B. FK_BRAND)

Warum verwendest Du immer wieder @Column(name = "..."). Bei Hibernate ist es so, dass
bei Spalten immer der Name des Getters(ohne get) Verwendung findet.
Damit heißt eine Spalte: name automatisch "name" in der Datenbank.
Das einzige was man entsprechend annotieren sollte sind Strings (nämlich die Länge).

Ein Beispiel wie man so etwas machen könnte hier.

Ich würde bei diesen Klassen noch einmal über das Design der Klassen bzw. des Objekt Modells nachdenken....
(oder auch der Datenbank) je nachdem wer zuerst da war....


MfG
Karl Heinz Marbaise
 

mad-din

Bekanntes Mitglied
kama hat gesagt.:
Hallo,
In welcher Beziehung stehen die Tabellen Brand und Keyword ? Bzw. deren Einträge?
Ein Brand hat einen oder mehrere Keyword's ? (1-zu-n) ?

Richtig, ein Brand hat ein oder mehrere Keywords.

kama hat gesagt.:
Weitere Frage:
Warum hat die Tabelle Brand eine Spalte "brandId" anstatt "Id".
Warum hat die Tabelle Keyword eine Spalte "brandId" anstatt "Id".

Ja, ich hätte brandid auch Id genannt, aber fürs Datenbankschema kann ich nix ;) Und die Tabelle Keyword hat deswegen eine Spalte "brandId", da diese als ForeignKey benötigt wird. Ansonsten funktioniert ja die Beziehung nicht!

kama hat gesagt.:
Wichtige Regel: Jede Tabelle hat Ihre eigene Sequence bzw. Auto increment Spalte.

Richtig, ich hätte die Tabelle Keyword auch anders gestaltet.

kama hat gesagt.:
Warum verwendest Du immer wieder @Column(name = "..."). Bei Hibernate ist es so, dass
bei Spalten immer der Name des Getters(ohne get) Verwendung findet.
Damit heißt eine Spalte: name automatisch "name" in der Datenbank.
Das einzige was man entsprechend annotieren sollte sind Strings (nämlich die Länge).

Hm, das mit @Column(name="") hab ich schlicht und einfach so gelernt. Tatsächlich ist es so, dass Hibernate manchmal die Spalten nicht gefunden hat ohne diese Annotation. Vor allem gibt es auch viele Spalten in der Datenbank, die ich im Programm gern anders schreiben würden (z.B. firstName statt firstname wie in der Datenbank).

Viele Grüße,
Martin
 
M

maki

Gast
Vor allem gibt es auch viele Spalten in der Datenbank, die ich im Programm gern anders schreiben würden (z.B. firstName statt firstname wie in der Datenbank).
Das heisst, die DB gibt es schon, um zu den Klassen zu kommen betreibst du reverse engineering?
 

mad-din

Bekanntes Mitglied
hi!

Richtig, die DB gibt es schon. Ich hab mir jetzt auch eben mal die Entites mit Netbeans erstellen lassen und Netbeans schreibt auch für jede Spalte @Column(name="name", nullable=false). Was ist jetzt also das richtige Vorgehen?
 
M

maki

Gast
>> Was ist jetzt also das richtige Vorgehen?

Wenn du reverse engineering betreibst, gibt es nur den einen (sinnvollen) Weg: die Entitäten aus der DB zu erstellen, ob mit Netbeans oder Eclipse oder sonstwie ist ja wurscht.

Du sollst also eine alte Anwendung migrieren?
Die DB besteht schon lange und hat auch schon Daten drinn?
 

mad-din

Bekanntes Mitglied
Hi!

Nein, migriert wird hier nix. Es geht um eine Erweiterung und die Tabellen haben teilweise schon Daten, teilweise auch nicht.

Viele Grüße
Martin
 
M

maki

Gast
>> Nein, migriert wird hier nix.

???

Du widersprichst dir da so ein bisschen...

Wenn die Anwendung schon existiert, existieren doch auch schon die JPA Mappings...

Was machst du denn genau maddin?
 

mad-din

Bekanntes Mitglied
Hi!

Es gibt bereits eine Anwendung, die auf dieser Datenbank aufbaut. Diese Anwendung ist ein Konsolenprogramm und läuft Tag und Nacht. Diese Anwendung soll um eine weitere Anwendung erweitert werden, sprich ein eigenes Konsolenprogramm, das die aktuelle Anwendug unterstützt. Da die aktuelle Anwendung aber noch kein JPA verwendet, gibt es dort auch keine Entities in dem Sinne. Deshalb wird die Erweiterung gleich JPA einsetzen und die alte Anwendung danach Stück für Stück an JPA angepasst.

Viele Grüße
Martin
 

mad-din

Bekanntes Mitglied
Hi!

Im Grunde eine Teilmigration ;) Es wird nur die Datenbankanbindung migriert, der Rest bleibt wie er ist.
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben