2017-05-09 2 views
1

今私はID、名前、パスワードなどの特定のフィールドを含むUserエンティティを持っています。ユーザーはまた、多対1にあるアイテムのエンティティの所有者、およびその逆の関係である:Hibernate - リレーションシップとそれらの管理をサブクラス化して素敵できれいに保つ

@Entity 
@Table(name="users") 
public class User { 
    /* Id, name, password etc - strictly User specified */ 



    private List<Item> ownedItems; 
    private List<Bike> ownedConsumables; 


    @OneToMany(fetch = FetchType.EAGER, mappedBy = "owner") 
    @Fetch(FetchMode.SELECT) 
    public List<Item> getOwnedItems() { 
     return ownedItems; 
    } 

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "owner") 
    @Fetch(FetchMode.SELECT) 
    public List<Consumable> getOwnedConsumables() { 
     return ownedConsumables; 
    } 




    // a lot of methods to manage collections to keep one-to-many consistency 
    // which are not related to strictly to User entity 
} 

このような組織(双方向)に関連する多くの一貫性の問題に、私は彼らに自分自身を管理したいですaddItem、removeItemなどのメソッドを適切に実装することで、これらはユーザーエンティティと直接関係しません。この責任を別のクラスに移すべきだと私は考えています。私は約考えました:

@Table(name="users") 
public class User { 
    /* Id, name, password etc - strictly User specified */ 

    private Inventory inventory; 
} 




public class Inventory { 
    private User owner; // if needed - I think it will 

    private List<Item> ownedItems; 
    private List<Bike> ownedConsumables; 


    @OneToMany(fetch = FetchType.EAGER, mappedBy = "owner") 
    @Fetch(FetchMode.SELECT) 
    public List<Item> getOwnedItems() { 
     return ownedItems; 
    } 

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "owner") 
    @Fetch(FetchMode.SELECT) 
    public List<Consumable> getOwnedConsumables() { 
     return ownedConsumables; 
    } 

    // a lot of methods to manage collections to keep one-to-many consistency 
} 

これはHibernateで可能ですか?これらのコレクションを適切に配置するために、すべてをマップするにはどうすればよいですか?

もう1つのアイデアは、Userオブジェクトを取得してコレクションを管理するクラスを作成することです。ただし、これにはownItemsフィールドとownedConsumablesフィールドがゲッターを介して公開されている必要があります。悪い

+1

@Embeddableでクラスに注釈を付けることで、@Embeddedでフィールドインベントリを行うことができますが、実際にはポイントが表示されません。 '.inventory'をどこにでも追加することで、コードとクエリを複雑にするだけです。 –

+0

私は@Embeddableについて読んでいますが、この場合はうまくいくとは考えていませんでしたが、それはそうだと思います。少し待って、私はいくつかのテストをもっと実行する必要があります。 –

+0

そして、コードの実践について、個人的には、たくさんのメソッドを持つクラスは好きではありません。user.getInventory()。addItem()はuser.addItemToInventory()よりもはるかに優れています。もちろん、a().b().c()。d()。e()のようなたくさんのメソッドを連鎖させることは、悪い練習です –

答えて

1

クラスには@Embeddable、フィールドにはinventory@Embeddedと注釈を付けることで、これを行うことができます。

+0

さらに詳しい調査では、親からの参照を保持するために@Parentという参照フィールドに注釈を付けることができますが、埋め込み可能なクラスは再利用できません –

関連する問題