私は既存のDBスキーマを持つレガシーコードベースで作業しています。既存のコードでは、SQLとPL/SQLを使用してDBに対してクエリを実行します。私たちは、プロジェクトのデータベースエンジンにとらわれない小さな部分(最初は、すべてを最終的に変更する)を担当するように任されています。 Hibernate 3.3.2.GAと "* .hbm.xml"マッピングファイル(注釈とは対照的)を使用することを選択しました。残念ながら、従来のスキーマを後退させることはできないため、既存のスキーマを変更することは現実的ではありません。1対多のFKでも使用されている複合IDキープロパティに「insert = 'false' update = 'false'」をマップする方法はありますか?
私が遭遇している問題は、FKがでもの複合PKの一部である一方向性、1対多の関係をマップしようとしているときです。ここではクラスとマッピングファイル...
CompanyEntity.java
public class CompanyEntity {
private Integer id;
private Set<CompanyNameEntity> names;
...
}
は、このコードは、単に作品CompanyNameEntity.java
public class CompanyNameEntity implements Serializable {
private Integer id;
private String languageId;
private String name;
...
}
CompanyNameEntity.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.jboss.org/dtd/hibernate/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.example">
<class name="com.example.CompanyEntity" table="COMPANY">
<id name="id" column="COMPANY_ID"/>
<set name="names" table="COMPANY_NAME" cascade="all-delete-orphan" fetch="join" batch-size="1" lazy="false">
<key column="COMPANY_ID"/>
<one-to-many entity-name="vendorName"/>
</set>
</class>
<class entity-name="companyName" name="com.example.CompanyNameEntity" table="COMPANY_NAME">
<composite-id>
<key-property name="id" column="COMPANY_ID"/>
<key-property name="languageId" column="LANGUAGE_ID"/>
</composite-id>
<property name="name" column="NAME" length="255"/>
</class>
</hibernate-mapping>
です名前の付いた会社のSELECTとINSERTには問題ありません。私は、既存のレコードを更新しようとしたときに問題が発生しました。私がされたBatchUpdateExceptionを受け、SQLのログを見た後、私は、Hibernateが
update COMPANY_NAME set COMPANY_ID=null where COMPANY_ID=?
Hibernateはそれらを更新する前にDIS-准子レコードにしようとしていた...何か
愚かをやろうとした見ました。問題は、このフィールドがPKの一部であり、null不可能であることです。私は、Hibernateにこれを行わないようにする簡単な解決策が、親マッピングの "key"要素に "not-null = 'true'"を追加することであることを発見しました。だから今マッピングが...このように見えるかもしれ
CompanyNameEntity.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.jboss.org/dtd/hibernate/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.example">
<class name="com.example.CompanyEntity" table="COMPANY">
<id name="id" column="COMPANY_ID"/>
<set name="names" table="COMPANY_NAME" cascade="all-delete-orphan" fetch="join" batch-size="1" lazy="false">
<key column="COMPANY_ID" not-null="true"/>
<one-to-many entity-name="vendorName"/>
</set>
</class>
<class entity-name="companyName" name="com.example.CompanyNameEntity" table="COMPANY_NAME">
<composite-id>
<key-property name="id" column="COMPANY_ID"/>
<key-property name="languageId" column="LANGUAGE_ID"/>
</composite-id>
<property name="name" column="NAME" length="255"/>
</class>
</hibernate-mapping>
このマッピングは、例外を与える...今
org.hibernate.MappingException: Repeated column in mapping for entity: companyName column: COMPANY_ID (should be mapped with insert="false" update="false")
私の問題は、私がしようと試みているということですこれらの属性をkey-property要素に追加しますが、これはDTDでサポートされていません。私はそれをキーの多対1の要素に変更しようとしましたが、それもうまくいきませんでした。したがって...
1対多数のFKでも使用されているコンポジットIDのキープロパティに「insert = 'false' update = 'false'」をマップする方法はありますか?
を必要とマッピングすることができ、それが見えます。私はこれをもう少し試して、結果を掲載します。 –
* .hbm.xmlファイルを使用して指定しようとしているマッピングは不可能です。これを達成する唯一の方法は、下記のmcyalcinの答えに記載されている注釈を使用することです。 –
この投稿はXML設定の問題を解決するかもしれないと思います。http://stackoverflow.com/questions/9381029/hibernate-mapping-exception-repeated-column-in-mapping-for-entity –