2017-04-26 7 views
1

Meine Datenbank besteht aus zwei Tabellen: Organisation und User, in einer ManyToOne Beziehung, wo eine Organisation viele Benutzer halten kann.Foreign Key Sharing im Hibernate

Bevor ich mein Problem teilen, hier sind meine Einheiten:

@Entity 
@Table(name = "organisation") 
public class OrganisationEntity { 
    @Id 
    @Column(name = "orga_id") 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    @NotNull 
    private String name; 

    // Getters & Setters 
} 

-

@Entity 
@Table(name = "\"user\"") 
public class UserEntity { 

    @Id 
    @Column(name = "user_id") 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    @NotNull 
    private String email; 

    @NotNull 
    private String firstName; 

    @NotNull 
    private String lastName; 

    @NotNull 
    private String password; 

    @ManyToOne(targetEntity = OrganisationEntity.class,cascade = CascadeType.ALL) 
    @JoinColumn(name = "orga_id") 
    private OrganisationEntity organisation; 

    // Getters & Setters  
} 

Hier mein Problem ist, wenn zwei Benutzer eine Organisation mit dem Namen gleichen zugeordnet sind, wobei Organisation wird zweimal in der Organisation Tabelle mit 2 verschiedenen IDs erstellt. Ich möchte die ID eines Unternehmens einem neuen Benutzer zuweisen, wenn es bereits existiert.

Wenn Benutzer U1 & U2 mit einer Organisation namens O1 erstellt werden, sollten beide die gleiche orga_id haben und nur ein Organisationseintrag in der Datenbank erstellt werden.

Wie kann das erreicht werden? Und was fehlt in meinem Verständnis von Hibernate?

Auf Anfrage, hier ist mein Dienst, der die UserEntity bei der Benutzerregistrierung erstellt:

@Override 
public UserInfo createUser(UserInfo newUser) { 
    return mapper.map(userDao.save(mapper.map(newUser))); 
} 

ich mit Mapstruct zu einem UserEntity und senden Sie es an meine DAO, um sie zu speichern Karte das Objekt in meinem Datenbank.

+0

Könnten Sie bitte nach dem Code, die/Updates und Einrichtungen schafft? –

+0

Ich habe meinen Service hinzugefügt, bitte lassen Sie mich wissen, wenn das nicht genug ist. – Christopher

+0

Sie haben erwähnt, dass Sie einer Organisation zwei Benutzer mit dem gleichen Namen zuweisen, was mich zu der Annahme verleitet, dass Sie zwei Organisationsinstanzen erstellen, und Sie geben beide den gleichen Namen, der in keiner Weise den Ruhezustand meldet dass sie tatsächlich die gleiche Organisation sind. Sie sollten 1 Organisation instanziieren und es beiden Benutzern zuweisen. Können Sie den Code veröffentlichen, in dem Sie die OrganizationEntity und die UserEntity erstellen? –

Antwort

0

Stellen Sie sicher, dass Sie nicht jedes Mal, wenn ein neuer Benutzer erstellt wird, eine neue Organisation-Instanz zuweisen, sondern zuerst die Datenbank nach einer vorhandenen Organisation anhand des Namens abfragen und die resultierende Entität für alle verwandten Benutzer erneut verwenden wenn es schon da ist.

Zusätzlich können Sie der organisation.name Spalte UNIQUE hinzufügen.

+0

Wo sollte diese Abfrage durchgeführt werden? In der DAO? Anstatt "nur" in der DB zu speichern, erstelle ich eine Methode, die UND speichern würde? – Christopher

0

Da Sie für verschiedene Benutzer keine unterschiedlichen Oraganisierungen wünschen, ist es besser, @GeneratedValue(strategy = GenerationType.AUTO) vom Id Attribut OrganisationEntity zu entfernen. Dies würde verhindern, dass mehr Organisationseinträge in der Datenbank erstellt werden.

holen auch OrganisationEntity Objekt erste und weisen UserEntity

+0

Verstanden, würde es überhaupt keine Einträge erstellen, oder? – Christopher