2

私には2つの基本抽象クラスがあり、これら2つから派生した複数の追加クラスがあり、追加の属性などを追加しています.

これらの特定の派生型の間には関係があります。

簡単な説明の例:

RoleおよびGroupクラスはabstractですが、 としてマークされていません@MappedSuperclass

InheritanceType.JOINED戦略が使用されているため、Role(抽象クラス用) とAdminRole(派生クラス用) の両方のテーブルが存在する必要があります (どちらも同じになりますRoleID)。

  • DiscussionGroupa 、 aという1 つのAdminRoleプロパティ があります。Set<DiscussantRole>Set<ManagerRole>
  • WorkingGroupSet<WorkerRole>、_Set<ManagerRole>
Role 
|-- AdminRole
|-- DiscussantRole
|-- ManagerRole
|-- WorkerRole

Group
|-- DiscussionGroup
|-- WorkingGroup

派生クラスの数が増える可能性があり、Role から派生したクラスが Group から派生したさまざまなクラスと関係を持つことができる (およびその逆) ため、大量の異なるマッピング テーブル (Worker_DiscussionGroup、Worker_WorkingGroup) または複数の外部キー列が発生します。 (M:1 関係の場合 - たとえば、ManagerRole には DiscussionGroupID と WorkingGroupId が必要です)。これらすべての関係を 1 つの共通のマッピング テーブルにマッピングしたいと考えています。

Role_Group (RoleID, GroupId)

現在の開発中に Hibernateを使用して DDL スキーマ (hbm2ddl.auto=create) を生成します (後で本番環境で使用するために静的スキーマ定義を使用します)。Hibernate はリレーションの外部キーを自動的に作成します。これは私たちにとって非常に良いことです。

結合にテーブルの同じマッピングを使用するように指示すると (多対多、多対多、および 1 対 1 にも)、外部キーも作成しようとします。もちろん、to と to で同時に外部キーを作成することはできないRoleIDためRole_GroupAdminRoleエラーDiscussantRoleが発生します。

Hibernateに指示する方法はありますか

  1. 外部キーなしで選択された関係を生成する

    また

  2. 関係が抽象的な祖先に基づく必要があることを定義するには (つまり、ディスカッショングループとそのセットは 1:N - グループとセットとしてマッピングする必要があります)?

4

2 に答える 2

4

以下は、質問番号2の回答として機能します。

@ForeignKey( name = "none" )

リレーションシップの外部キーは生成されていません。

@Cascade( value = { CascadeType.ALL } )
@OneToOne( fetch = FetchType.EAGER, orphanRemoval = true )
@JoinTable( name = "Role_Group",
            inverseJoinColumns = { @JoinColumn( referencedColumnName = "rolleId", name = "RolleID" ) },
            joinColumns = { @JoinColumn( referencedColumnName = "groupId", name = "GroupID" ) } )

@ForeignKey( name = "none" )
public AdminRole getAdmin()

ソース:

ソースに基づくと、これはリリース ノートに記載されていた文書化されていない機能です。

Changes in version 2.1.9 (xx.x.xxxx)
------------------------------------
* TimesTenDialect now supported (look at TimesTenDialect for certain limitations)
* foreign-key="none" can be used to disable generation of a foreign key.

xml構成では、次のように使用します

<many-to-one name="Hospital" column="hospitalId" property-ref="hospitalId" update="false" insert="false" foreign-key="none">

Let Hibernate Connect Your World!で述べたように (ページのソースを参照してください - xml 構成はページに表示されません)

ノート:

ただし、これで問題全体が解決するわけではありません。getAdminHibernate は、このマッピング テーブルを介して適切なデータを取得できません。これは、 を探してを検索getManagersし、それがorであるかどうかがわからず、 「指定された識別子を持つ行が存在しません」というエラーが発生するためです。Role_GroupRoleIDsDiscussionGroup GroupIDAdminRoleManagerRole

同様のマッピングが機能しますが、 Group または DiscussionGroup でそのようなテーブルを使用するとpublic Set<Role> getRoles()、Hibernate は派生クラス ( AdminRoleManagerRole) を Set に正常にロードします。

于 2011-09-06T12:32:32.107 に答える
1

複数のテーブルを保持する必要があると思います。クラスに存在する関係をマッピングするだけです。

それを望まない場合は、Set<Role>inside 抽象GroupSet<Group>in 抽象を定義できますRole。サブクラスには「サブセット」はありません。抽象クラスのセットに適切な型の適切な要素を入力するだけです。自動マッピングにより、必要な単一の結合テーブルが得られます。

于 2011-09-06T01:36:22.353 に答える