0

一般的な多対多の関係 (リスト) を作成したいと考えています。

次の例のドメインを使用します。

+-------+  +----------+ +-----------+
| Issue |  | Web Page | | Wiki Page |  
+-------+  +----------+ +-----------+

次のような一般的なリンクの関連付けを作成したいと思います。ここで、fromtoは上記のドメイン オブジェクトのいずれかです。

+---------------------+ 
| Link                |
+---------------------+ 
| Object: from        |
| Object: to          |
| String: description |
+---------------------+ 

問題が関係の片側にある場合、Issuehas-manyです。Link

次のようなリンク テーブルを使用することを想定しています。

Link Table
| ID | SRC_ID | SRC_CLASS | DEST_ID | DESC_CLASS |

したがってSRC_IDDEST_ID適切なテーブルへの外部キーです。

リンク テーブルのマッピングはどのようになりますか?

4

2 に答える 2

0

クラスHibernateからテーブルを手動で作成しないでください。Entitypojoに注釈@ManyToManyを付けるだけで、hibernate は、関連するテーブルとのすべての外部キー関係を使用して、データベースのスキーマを生成します。

Hibernate の多対多の一方向マッピングは次のようになります。

@Entity
class Issue{
  @ManyToMany
  List<Link> links;
}

@Entity
class Link{
}

アプリケーションが Java SE の場合、クラスを使用SchemaExportしてデータベースにスキーマを生成します。

于 2013-09-29T06:34:32.043 に答える
0

この関係をドメイン オブジェクトから完全に外部化することで実装しました。

例 (Groovy+Grails)

class Link{
   String fromClass
   long fromId
   String toClass
   long toId
   String description

   Link(){}
   Link(Object src, Object dest, String descrption){
      fromClass=src.class.name
      fromId=src.id
      toClass=dest.class.name
      toId=dest.id
      this.description=description
   }

   Object getFrom(){
      // Invoke GORM static finder
      Class.forName(fromClass)."get"(fromId)
   }

   Object getTo(){
      // Invoke GORM static finder
      Class.forName(toClass)."get"(toId)
   }
}

オブジェクトを作成/取得するための関連するサービス層を使用:

import org.springframework.transaction.annotation.Transactional
class LinkableService {
  @Transactional
  public void link(Object src, Object dest, String description){
    Link link = new Link(src,dest,description)
    link.save()
  }

  @Transactional(readOnly=true)
  public Collection<Link> links(Object subject){
    def fromLinks = Link.findAllWhere(fromClass:subject.class.name, fromId:subject.id)
    def toLinks = Link.findAllWhere(toClass:subject.class.name, toId:subject.id)
    def allLinks = new ArrayList<Link>(fromLinks)
    allLinks.addAll(toLinks)
    return allLinks
  }

}

私はパフォーマンスについて少し心配していますが、小さなデータセットで作業することしか期待していないので、大きな問題にはなりません. メトリクスがなければ、まだ最適化しません!

しかし、より良い解決策はありますか?

于 2013-10-05T00:29:23.503 に答える