Hallo,
ich habe mich die letzten Monate damit rumgeschlagen mich mal in den EJB 3.0 Standard einzuarbeiten. Ich habe bislang weder ernsthaft mit SQL noch mit EJB gearbeitet und habe nun ein recht banales allerdings ärgerliches Problem.
Ich habe ein Datenbank Schema das ich nun per Annotations mappen will.
In all den Beispielen die ich mir bisher angeschaut habe werden (vermutlich im Zuge der Vereinfachung) Tabellen verwendet die eben jeweils nur eine Fremdschlüsselrelation auf die andere Tabelle besitzt. In der Praxis ist das allerdings nur selten der Fall. Mich würde nun interessieren wie man n:1, 1:n bzw n:m Beziehungen zwischen diversen Tabellen herstellt wenn man in einer Tabelle von mehreren Fremdschlüsseln auf einen Primärschlüssel einer anderen Tabelle per Annotations abbildet.
Grundsätzlich funktioniert bei mir eine einfache ManyToOne Beziehung, für den Fall nur eines Fremdschlüssels auf einen respektiven Primärschlüssel folgendermaßen (ich lasse mich hier auch gerne korrigieren).
Listing: Author
Listing: Project
Der Rest sind nur noch obligatorische getter/setter Methoden die ich der Übersichtlichkeit wegen hier mal nicht aufgeführt habe. Ein kleines Diagramm der Beziehung zwischen den beiden Entities ist angehängt. Die beiden Primärschlüssel sind project_id und author_id. Die beiden Fremdschlüssel project_leader und security_officer sollen nun beide über eine ManyToOne Beziehung mit author_id verknüpft werden. Allerdings kann ich leider nicht mehrere @JoinColumn Annotations angeben, was mir naiv erst mal als logisch erschien. @JoinColumns wiederum scheint sich nur auf zusammengesetzte Schlüssel zu beziehen, was hier eben auch nicht der Fall ist. Das ganze mit einer extra Tabelle, sprich über die @JoinTable Annotation, zu lösen scheint mir wiederum etwas kompliziert.
Ich habe mich hier auch für eine bidirektionale Beziehung entschieden weil ich damit glaube auf der sicheren Seite zu sein. Wann es sich nun jedoch anbietet eine unidirektionale Beziehung zu verwenden ist mir noch nicht ganz klar.
Ein anderes Problem habe ich mit der @GeneratedValue Annotation. Denn sobald ich diese einkommentiere und mir meine Entitäten persistieren lassen, werden gerade die Tabellen nicht erstellt bei denen ein Schlüssel eben auto-inkrementiert werden soll. Ich habe versucht einen Workaround über alle möglichen GenerationTypes zu finden, unter anderem mit @SequenceGenerator, aber leider ohne Erfolg.
Ich bin mir sicher, auch wenn der Standard noch recht neu ist wird sich hier jemand vermutlich schon etwas tiefer mit dem Thema befasst haben, für den diese Probleme trivial erscheinen und der mir hoffentlich weiterhelfen kann. Würde mich freuen wenn mir dieser jemand weiterhelfen könnte
Bis denn,
Kay
P.S.: Ich glaube zwar nicht das es eine weiterreichende Relevanz hat aber hier noch meine Systemdaten:
Ubuntu 8.04
MySQL 5.0
JBoss4.2.2
Eclipse3.3 (innerhalb Eclipse mit JBoss IDE)
Java EE 5
ich habe mich die letzten Monate damit rumgeschlagen mich mal in den EJB 3.0 Standard einzuarbeiten. Ich habe bislang weder ernsthaft mit SQL noch mit EJB gearbeitet und habe nun ein recht banales allerdings ärgerliches Problem.
Ich habe ein Datenbank Schema das ich nun per Annotations mappen will.
In all den Beispielen die ich mir bisher angeschaut habe werden (vermutlich im Zuge der Vereinfachung) Tabellen verwendet die eben jeweils nur eine Fremdschlüsselrelation auf die andere Tabelle besitzt. In der Praxis ist das allerdings nur selten der Fall. Mich würde nun interessieren wie man n:1, 1:n bzw n:m Beziehungen zwischen diversen Tabellen herstellt wenn man in einer Tabelle von mehreren Fremdschlüsseln auf einen Primärschlüssel einer anderen Tabelle per Annotations abbildet.
Grundsätzlich funktioniert bei mir eine einfache ManyToOne Beziehung, für den Fall nur eines Fremdschlüssels auf einen respektiven Primärschlüssel folgendermaßen (ich lasse mich hier auch gerne korrigieren).
Listing: Author
Code:
package entities;
import java.util.ArrayList;
import java.util.Collection;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
@Entity
@NamedQueries( { @NamedQuery(name = "Author.findAll", query = "SELECT a FROM Author a ORDER BY a.id") })
public class Author {
@OneToMany
@JoinColumn(name="authorId")
private Collection<Project> projects = new ArrayList<Project>();
@Id
@GeneratedValue
private int authorId; // NotNull; Unique; AutoInc
private String firstName;
private String lastName;
private String department;
[...]
Listing: Project
Code:
package entities;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
@Entity
@NamedQueries( { @NamedQuery(name = "Project.findAll", query = "SELECT a FROM Project a ORDER BY a.id") })
public class Project implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
@ManyToOne(optional = false)
@JoinColumn(name = "leader", nullable = false, insertable = false, updatable = false)
private Author author;
@Id
@GeneratedValue
@Column(nullable = false, unique = true)
private int projectId;
@Column(nullable = false)
private String title;
@Column(nullable = false)
private int leader;
@Column(nullable = false)
private int securityOfficer;
[...]
Der Rest sind nur noch obligatorische getter/setter Methoden die ich der Übersichtlichkeit wegen hier mal nicht aufgeführt habe. Ein kleines Diagramm der Beziehung zwischen den beiden Entities ist angehängt. Die beiden Primärschlüssel sind project_id und author_id. Die beiden Fremdschlüssel project_leader und security_officer sollen nun beide über eine ManyToOne Beziehung mit author_id verknüpft werden. Allerdings kann ich leider nicht mehrere @JoinColumn Annotations angeben, was mir naiv erst mal als logisch erschien. @JoinColumns wiederum scheint sich nur auf zusammengesetzte Schlüssel zu beziehen, was hier eben auch nicht der Fall ist. Das ganze mit einer extra Tabelle, sprich über die @JoinTable Annotation, zu lösen scheint mir wiederum etwas kompliziert.
Ich habe mich hier auch für eine bidirektionale Beziehung entschieden weil ich damit glaube auf der sicheren Seite zu sein. Wann es sich nun jedoch anbietet eine unidirektionale Beziehung zu verwenden ist mir noch nicht ganz klar.
Ein anderes Problem habe ich mit der @GeneratedValue Annotation. Denn sobald ich diese einkommentiere und mir meine Entitäten persistieren lassen, werden gerade die Tabellen nicht erstellt bei denen ein Schlüssel eben auto-inkrementiert werden soll. Ich habe versucht einen Workaround über alle möglichen GenerationTypes zu finden, unter anderem mit @SequenceGenerator, aber leider ohne Erfolg.
Ich bin mir sicher, auch wenn der Standard noch recht neu ist wird sich hier jemand vermutlich schon etwas tiefer mit dem Thema befasst haben, für den diese Probleme trivial erscheinen und der mir hoffentlich weiterhelfen kann. Würde mich freuen wenn mir dieser jemand weiterhelfen könnte

Bis denn,
Kay
P.S.: Ich glaube zwar nicht das es eine weiterreichende Relevanz hat aber hier noch meine Systemdaten:
Ubuntu 8.04
MySQL 5.0
JBoss4.2.2
Eclipse3.3 (innerhalb Eclipse mit JBoss IDE)
Java EE 5
Anhänge
Zuletzt bearbeitet: