2016-06-17 18 views
1

Ich habe eine Klasse namens BusinessUser, die eine Business-ID hat und ein Objekt namens BusinessData hat. In der BusinessData Klasse gibt es eine ArrayList von Campaign Objekten wie unten dargestellt:Ist es möglich, Fremdschlüssel mit Hibernate-Annotationen zu verknüpfen?

@Embeddable 
@Access(AccessType.FIELD) 
public class BusinessData { 
    @Transient 
    private ArrayList<Campaign> campaigns; 
    /... 
} 

In der Campaign Klasse gibt es eine Business-ID, die angeblich einen Fremdschlüssel sein, die das Geschäft ID-Spalte in der Business-User Tabelle verweist .

@MappedSuperclass 
public class Campaign { 

    @ManyToOne 
    private long businessId; 
    /... 
} 

Gibt es eine Möglichkeit ich den Wert businessId zum businessId in der BusinessUser Klasse zuordnen kann Campaign halten ein BusinessUser Objekt zu haben, ohne zu haben? Oder sollte ich einfach ein BusinessUser Objekt hinzufügen und den Fremdschlüssel so abbilden?

Auch ich weiß nicht, ob ich falsch liege. Wenn ich ein BusinessUser Objekt halten muss, wird es ein BusinessData Objekt enthalten, das ein ArrayList von Campaign Objekte enthalten wird, die ein anderes BusinessUser usw. enthalten werden usw. Oder liege ich falsch darin zu denken, dass es ein nie ist Endzyklus?

Antwort

0

Ja, Sie sind falsch und Recht in denken, dass es ein nie endender Zyklus,

das ist falsch, weil BusinessData (obwohl eine ArrayList<Campaign> enthält) ist erhalten sie Daten aus der Datenbank ist.

Dies bedeutet, dass es eine BusinessUser enthält, die BusinessData nicht hat. also hört die Schleife hier auf.

Aber Sie haben recht, wenn die ArrayList<Campaign> in BusinessData ein BusinessUser enthält, die BusinessData hat.

Das heißt, die Schleife ist in der Datenbank identisch.

Sie könnte theoretisch eine SQL schreiben, die so geht:

SELECT BU.businessId 
FROM BusinessUser BU 
INNER JOIN BusinessData BD ON BU.businessId = BD.businessId 
INNER JOIN campaigns C ON BD.campaignsId = C.Id 
    AND C.businessId = BU.businessId 

Dies wird Ihnen ein Ergebnis aller BusinessUser, die innerhalb des ArrayList<Campaing> enthalten sind, die auf das ausgewählte BusinessUser gleich sind.

Das ist nicht falsch, es könnte etwas zu prüfen sein.

Das heißt, wieder, können Sie Ihre Campaign wie so abbilden sollte:

@MappedSuperclass 
public class Campaign { 

    @ManyToOne 
    private BusinessUser businessUser; 
    /... 
} 

Hinweis auf den private BusinessUser businessUser;!

+0

Ich fand diesen Ansatz auch, aber ich hörte es schlechtes Design. wäre '@ManyToOne @JoinColumn (name =" business_id ", tabelle =" business_users ")'. Wenn das nicht funktioniert, werde ich definitiv mit Ihrer Lösung gehen. Vielen Dank für Ihre gründliche Erklärung. –

0

@Join-Spalte (name = "reference_column_name") Annotation kann oberhalb der Eigenschaft oder des Felds der Klasse verwendet werden, auf die von einer anderen Entität verwiesen wird.

+0

Aber wenn ich das gerade über 'private long businessId' verwendet, wie würde es wissen, die Tabelle BusinessUsers im Gegensatz zu der Tabelle Campaign delegiert in dieser Klasse zu verweisen? Ich müsste ein Objekt 'BusinessUser' hinzufügen, oder? Also gibt es keinen Weg dazu? –

Verwandte Themen