4

私は多くのMavenモジュールを含む大規模なモジュール化されたプロジェクトに取り組んでおり、依存関係の管理は非常に複雑です。

コアモジュールには、多くの属性を持つエンティティBackOfficeUserがあります。このエンティティは、ほとんどのアプリケーションモジュールで使用されます。


しかし、私のモジュールXXXの1つは、エンティティUserRuleのコレクションでユーザーを拡張する必要があります。

私が知りたいのは、コアBackOfficeUserをサブクラス化して、BackOfficeUserのコアdbテーブルに新しい列を必要としない、エンティティが所有していない新しい関係を使用して、アプリケーションでXXXBackOfficeUserを作成できるかどうかです。

DAOを作成して電話をかけることができることはrulesDAO.findByUser(BackOfficeUser user) 知っていますが、代わりにそれが可能かどうか知りたいのですがXXXBackOfficeUser.getRules()

他の多くのモジュールによって使用され、MappedSuperClassまたは通常の休止状態エンティティ以外のものではないコアBackOfficeUserクラスを変更せずにすべて。

4

1 に答える 1

1

BackOfficeUserクラスを変更しないと不可能ですが、BackOfficeUserが永続化されているテーブルを変更しないと可能です。BackOfficeクラスに必要な変更は次のとおりです。

@Inheritance(strategy = InheritanceType.JOINED)

Hibernateでは、Hibernateサポートが識別子列なしで継承に参加したため、これによってルートテーブルに追加のDTYPE列が追加されることはありません。仕様がサポートを必要としないため、ディスクリミネーターなしの結合継承は移植性がありません。結果として、BackOfficeUserの実際のタイプを定義するために、クエリは常に新しいテーブルに結合されます。

実装はおおまかに次のようになります。

//Existing BackOfficeUser, @Inheritance is added
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class BackOfficeUser {
    @Id private Integer id;
}


//New class that extends BackOfficeUser. Will have dedicated
//table for added persistent attributes, shared attributes
//are persisted to existing table "BackOfficeUser"
@Entity
public class XxxBackOfficeUser extends BackOfficeUser {
    private String someAttribute

    @ManyToMany (mappedBy = "xxxBackOfficeUsers")
    private List<Rule> rules;
}

//New entity class which does have relation to XxxBackOfficeUser
@Entity
public class Rule {
    @Id private Integer id;

    @ManyToMany
    private List<XxxBackOfficeUser> xxxBackOfficeUsers;
}
于 2012-08-28T18:54:00.220 に答える