2016-12-15 6 views
0

Ich möchte Hibernate generieren einige Tabellen mit Fremdschlüsseln und so weiter. Ich gebe Ihnen ein Beispiel für die Abfrage i wintern wollen generieren:Hibernate ForeignKey Mapping Anmerkungen

create table RealtimeCost(id INTEGER not null primary key Autoincrement, 
    mnemonic varchar(50)not null references Exchange(mnemonic), 
    sid int not null references License(sid), 
    price numeric(10,2) not null) 

so diese Abfrage sollte durch Hibernate Annotations über erzeugt werden. Die entsprechende Klasse ist dies:

@Entity 
@Table 
public class RealtimeCost { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Integer id; 
    @MapsId("mnemonic") 
    @JoinColumn(referencedColumnName="sid") 
    private String mnemonic; 
    @MapsId("sid") 
    @JoinColumn(referencedColumnName="sid") 
    private Integer sid; 
    @Column 
    private Double price; 

Beispiel für das, was die mnemonic in RealtimeCost sollten abgebildet werden (jeweils mnemonic in RealtimeCost hat genau 1 Wert in Exchange):

@Entity 
@Table 
public class Exchange { 
    @Id 
    @Column(name="mnemonic") 
    private String exchange; 
    @Column 
    private String description; 

Wie Sie kann ich sehen, habe ein bisschen mit Hilfe der Docs versucht, aber ich konnte die Fremdschlüssel nicht durch Ruhezustand generieren lassen. Es wäre wirklich nett, wenn mir jemand die nötigen Annotationen und Werte für diese Klasse sagen könnte, also kann ich es auch für die anderen Klassen tun. Bitte teilen Sie mir auch mit, ob ich etwas in der Klasse Exchange ändern muss, damit das Mapping funktioniert. Vielen Dank im Voraus

Antwort

1

Ich bin kein Experte, aber wir lassen Ruhezustand machen die ganze Arbeit mit den javax.persistence Annotationen für die Verbindung von Entitäten.

@javax.persistence.ManyToOne(fetch = javax.persistence.FetchType.EAGER, optional = true) 
    @javax.persistence.JoinColumn(name = "VIEWTYPE_ID", nullable = true, unique = false, insertable = true, updatable = true) 
    private com.company.other.subproject.ViewType viewType; 

Vielleicht ist das, was Sie brauchen. Da wir uns Gedanken über die Tabellen machen müssen, die erstellt werden müssen oder nicht, werden die foreignKeys automatisch mit dem Dialekt der Datenbank erstellt, mit der Sie kommunizieren.

+0

Ist dies ein Objekt des Typs 'ViewType' auf die ID der Klasse' ViewType' abgebildet? – Aelop

+0

Können Sie mir sagen, wie Sie die Viewtyp-ID annotiert haben? – Aelop

+0

Sorry für die späte Antwort. Ja, es bildet die Entität als ID-Referenz ab. Mit dem FetchType können Sie weiter spezifizieren, wie es geladen werden soll. (Lazy oder Eager) Der ViewType ist mit diesem '@AttributeOverrides ({@AttributeOverride (Name =" ID ", Spalte = @Column (Name =" VIEWTYPE_ID ")) }) Annotated aber diese Annotation ist bei der Definition der Klasse . da wir eine andere Strategie zur Deklaration von Entitäten verwenden. Die ID-Spalte ist jedoch mit @Id versehen. Dies ist eine Beispielannotation für den Abruftyp '@ javax.persistence.Basic (fetch = javax.persistence.FetchType.EAGER, optional = false)' – Nico

1

Sie sollten die Zuordnung in einer Entität einrichten und die mappedBy in der anderen verwenden. Sie benötigen @MapsId nicht, weil Sie keine eingebetteten Entitäten verwenden (lesen Sie die Dokumentation). Werfen Sie einen Blick auf die @OneToMany und @ManyToOne Beziehungen:

@Entity 
@Table 
public class RealtimeCost { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Integer id; 

    @OneToMany 
    @JoinColumn(name="mnemonic") 
    private Exchange exchange; 
    ... 
} 

@Entity 
@Table 
public class Exchange { 
    @Id 
    @Column(name="mnemonic") 
    private String mnemonic; 

    @Column 
    private String description; 

    @ManyToOne(mappedBy="exchange") 
    private RealtimeCost realtimeCost; 
    ... 
} 
+0

dies '@ManyToOne (mappedBy =" exchange ")' verursacht einen Fehler für Ich 'Das Attribut mappedBy ist für den Annotationstyp ManyToOne' nicht definiert – Aelop

2
@ManyToOne(fetch = FetchType.EAGER) 
@JoinColumn(name = "accommodation_type", unique = true, nullable = false) 
private AccommodationType accommodationType; 

@ManyToOne() eine Beziehung nach @JoinColumn() name in @JoinColumn() schafft, ist der Name der Tabelle, die Sie eine Verbindung herstellen möchten.

Dann, wenn Sie eine Klasse erstellen, die Hauptklasse werden verbunden wird, müssen Sie es zunächst Namen, eine Tabelle geben unter @Entity beispiels @Table(name="accommodation_types")

Dann Sie Ihre Variable erstellen.

//bi-directional many-to-one association to Accommodation 
@OneToMany(mappedBy="accommodationType", fetch=FetchType.EAGER) 
private List<Accommodation> accommodations; 

Wert von mappedBy ist der Variablenname in Hauptklasse.

1

Jede hier gepostete Antwort bekam eine positive Bewertung von mir, weil jeder recht hatte, aber es war nicht 100% was ich suchte, aber es half mir mein Problem selbst zu lösen. Für das Beispiel i geschrieben, suchte die Lösung i ist wie folgt (Ich habe auch keine Nullwerte enthalten):

@Entity 
@Table 
public class RealtimeCost { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Integer id; 
    @ManyToOne 
    @JoinColumn(name = "mnemonic",nullable=false) 
    private Exchange exchange; 
    @ManyToOne 
    @JoinColumn(name = "sid",nullable=false) 
    private License license; 
    @Column(nullable=false) 
    private Double price; 

das sind die Anmerkungen i wurde für RealtimeCost Klasse sucht. Ich brauchte keine speziellen Anmerkungen in der [email protected] Antwort war am nächsten, was ich brauche, daher wird seine Antwort akzeptiert werden