0

私はこれらの2つのテーブルを持っています:

CREATE TABLE IF NOT EXISTS `functions` (
`idFunction` int(11) NOT NULL,
`idLanguage` int(11) NOT NULL,
`name` varchar(30) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`idCategory` int(11) DEFAULT '1',
PRIMARY KEY (`idFunction`,`idLanguage`),
KEY `idCategory` (`idCategory`),
KEY `idLanguage` (`idLanguage`),
CONSTRAINT `FK_functions_categories` FOREIGN KEY (`idCategory`) REFERENCES            
`category_package` (`idCategory`) ON DELETE NO ACTION ON UPDATE CASCADE,
CONSTRAINT `FK_functions_languages` FOREIGN KEY (`idLanguage`) REFERENCES `languages`  (`idLanguage`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `subfunctions` (
`idParent` int(11) NOT NULL,
`idChild` int(11) NOT NULL,
PRIMARY KEY (`idParent`,`idChild`),
KEY `idChild` (`idChild`),
CONSTRAINT `FK_subfunctions_functions` FOREIGN KEY (`idParent`) REFERENCES `functions` (`idFunction`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `FK_subfunctions_functions_2` FOREIGN KEY (`idChild`) REFERENCES `functions` (`idFunction`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

そして、Hibernate のリバース エンジニアリングを使用してこれらのテーブルをマップしようとすると、マッピングが発生しますが、2 つのテーブルを含むクエリを実行しようとすると、Hibernate から次の例外がスローされます。

Foreign key (FKFD0F515B161D5928:subfunctions [idParent])) must have same number of columns as the referenced primary key (functions [idFunction,idLanguage])

サブ関数テーブルにも PK として idLanguage を配置するのが実際の取引であることはわかっていますが、レガシー DB を使用していて、それを変更することはできません。

これをマッピングする方法はありますか?

4

1 に答える 1

0

マッピングについて多くの詳細を提供していないため、ここで支援するのは簡単ではありません. 一般に、両方のテーブルの主キーは複合キーであるため、http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/#d0e2177に示すように、これを埋め込み可能なクラスにマップできます。

上記のクラスのサンプル マッピングは次のようになります。

@Entity
@Table(name = "functions")
public class Functions {

    @Id
    private FunctionPK functionPK;

    @Column(name="name", nullable=false)
    private String name;

    @Column(name="idCategory", nullable=false)
    @ManyToOne(cascade=CascadeType.SAVE_UPDATE)
    @JoinColumn(name = "idCategory")
    private CategoryPackage idCategory;

...
}

@Embeddable 
  private class FunctionPK implements Serializable
  {

    @Column(name="idFunctions")
    private int idFunctions;

    @Column(name="idLanguage")
    @ManyToOne(cascade=CascadeType.ALL)
    @JoinColumn(name = "idLanguage")
    private Language idLanguage;

    //Some getters and setters 
    ...
  }

@Entity
@Table(name = "subfunctions")
public class SubFunctions {

    @Id
    private SubFunctionPK subFunctionPK;

...
}

@Embeddable 
  private class SubFunctionPK implements Serializable
  {

    @Column(name="idParent")
    @ManyToOne(cascade=CascadeType.ALL)
    @JoinColumn(name = "idFunction")
    private Functions idParent;

    @Column(name="idChild")
    @ManyToOne(cascade=CascadeType.ALL)
    @JoinColumn(name = "idFunction")
    private Functions idChild;

    //Some getters and setters 
    ...
  }
于 2012-09-19T13:36:53.273 に答える