1

Hibernate を使用して、小さくて奇妙な問題が発生しています。2 つのサービス間の関係を定義する「SERVICE」と SERVICE_RELATIONSHIP の 2 つのテーブルがあります。

CREATE TABLE TMS.TB_SERVICE ( 
    ID_SERVICE  INTEGER NOT NULL,
    NAME        VARCHAR(255),
)


CREATE TABLE SERVICE_RELATIONSHIP ( 
    ID_SERVICE      INTEGER NOT NULL,
    ID_SERVICE_REL  INTEGER NOT NULL,
    RELATIONSHIP    VARCHAR(1)  // Could be 'E' (Exclude) or 'I' (Include)
    )

サービスが持つ関係のタイプに応じてサービスを取得するために、さまざまなメソッド (getInclude と getExclude) を使用します。それらは完璧に機能します。唯一の問題は、 service を永続化したい場合です。 ID_SERVICE および ID_SERVICE_REL 列は正しく挿入されますが、 RELATIONSHIP は挿入されません

@Table(name="SERVICE")
public class Service implements Serializable {
    private String name;
    private Integer id;
    private Collection<Service> exclude;
    private Collection<Service> include;
     [..]
    @JoinTable(name = "SERVICE_RELATIONSHIP", 
      joinColumns = {
        @JoinColumn(name="ID_SERVICE", unique = false, updatable = true)
      },
      inverseJoinColumns = {
        @JoinColumn(name="ID_SERVICE_REL")
      }
    )
    @WhereJoinTable(clause = "RELATIONSHIP='E'")
    public Collection<Service> getExclude() {
        return exclude;
    }

    [..] 
    @OneToMany(fetch=FetchType.EAGER)
    @JoinTable(name = "SERVICE_RELATIONSHIP",
      joinColumns = {
        @JoinColumn(name="ID_SERVICE", unique = false, updatable = true)           
      },
      inverseJoinColumns = {
        @JoinColumn(name="ID_SERVICE_REL")
      }
    )
    @WhereJoinTable(clause = "RELATIONSHIP='I'")
    public Collection<Service> getInclude() {
        return include;
    }
}

何か案は?前もって感謝します

4

1 に答える 1

0

@WhereJoinTable名前が示すように、select 句で結合を行うときの Where 条件にのみ使用されます。

これを実装するには、いくつかのオプションがあります。

  1. 関係をクラスとしてマップします。
  2. 包含テーブルと除外テーブルを作成します。

個人的には、リレーションシップ クラスをマップしますが、外部からは隠しておくServiceので、サービスを使用するコードはリレーションシップ クラスを認識しません。

于 2012-10-04T19:40:27.213 に答える