2017-04-26 9 views
1

私のデータベースはOrganisationUserの2つのテーブルで構成されています。組織内には多数のユーザーを保持できるManyToOneの関係があります。Hibernateでの外部キーの共有

私はここに、私の問題を共有する前には、私の実体である:

@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  
} 

二人のユーザが同じ名前の組織が割り当てられたときに、私の問題である、と述べました組織は2種類のIDを持つOrganisationテーブルに2回作成されます。新しいユーザーに既に組織のIDが割り当てられている場合は、そのIDを新しいユーザーに割り当てることを希望します。

したがって、ユーザーU1 & U2がO1という組織で作成されている場合は、どちらも同じorga_idであり、データベースに作成する組織エントリは1つだけにする必要があります。

どのように達成できますか? Hibernateの私の理解に欠けているものは何ですか?要求で

、ここではユーザ登録時にUserEntityを作成し、私のサービスは以下のとおりです。

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

私はUserEntityMapstructでオブジェクトをマッピングし、私のDAOにそれを送る私の中でそれを保存するために、データベース。

+0

に割り当てますが作成/更新エンティティを、同様のコードを投稿してくださいもらえますか? –

+0

サービスを追加しました。十分でない場合はお知らせください。 – Christopher

+0

「同じ」名前の組織に2人のユーザーを割り当てたと述べました。これは、2つの組織インスタンスを作成していると信じさせ、同じ名前を与えています。彼らは実際には同じ組織です。 1つの組織をインスタンス化して両方のユーザーに割り当てる必要があります。 OrganizationEntityとUserEntityを作成する場所にコードを投稿できますか? –

答えて

0

新しいユーザーが作成されるたびに新しいOrganisationインスタンスを割り当てるのではなく、最初に名前で既存の組織のDBにクエリを実行し、関連するすべてのユーザーに対して結果のエンティティを再利用するようにしますそれが既にあるならば。

さらに、正確性のために、organisation.name列にUNIQUE制約を追加することを検討してください。

+0

そのクエリはどこで実行されるべきですか? DAOでは? DBに保存するのではなく、チェックして保存するメソッドを作成しますか? – Christopher

0

異なるユーザーに別々の儀式を必要としないように、の属性OrganisationEntityから@GeneratedValue(strategy = GenerationType.AUTO)を削除することをお勧めします。これにより、DBに組織エントリをさらに作成することができなくなります。

また最初OrganisationEntityオブジェクトをフェッチし、UserEntity

+0

わかりましたが、それでは全くエントリを作成しませんでしたか? – Christopher

関連する問題