hibernate映射中的另一个重复列

时间:2014-07-31 08:15:10

标签: java hibernate

Hibernate给了我以下异常

 org.hibernate.MappingException: Repeated column in mapping for entity: Pricelist column: ID_OFFER (should be mapped with insert="false" update="false")

但我真的找不到ID_OFFER的重复引用。这里是他们涉及的两个映射文件。

Offer.hbm.xml

<hibernate-mapping>
 <class name="Offer" table="OFFERS">
  <id name="idOffer" type="java.lang.Long">
   <column name="ID_OFFER" not-null="true" precision="10" scale="0"
    sql-type="NUMBER" unique="true"/>
   <generator class="native">
    <param name="sequence">OFFERS_SEQ</param>
   </generator>
  </id>
  <property generated="never" lazy="false" name="name" type="string">
   <column name="name" not-null="true" sql-type="VARCHAR2" unique="true"/>
  </property>
  <set name="pricelists" sort="unsorted" table="PRICELISTS">
   <key not-null="true">
    <column name="ID_OFFER" not-null="true" precision="10" scale="0" sql-type="NUMBER"/>
   </key>
   <one-to-many class="Pricelist"/>
  </set>
 </class>
</hibernate-mapping>

Pricelist.hbm.xml

<hibernate-mapping>
 <class name="Pricelist" table="PRICELISTS">
  <id name="idPricelist" type="java.lang.Long">
   <column name="ID_PRICELIST" not-null="true" precision="10" scale="0" sql-type="NUMBER"/>
   <generator class="native">
    <param name="sequence">PRICELISTS_SEQ</param>
   </generator>
  </id>
  <property name="name" type="string">
   <column length="255" name="NAME" not-null="true" sql-type="VARCHAR2"/>
  </property>
  <property name="versionMajor" type="integer">
   <column name="VERSION_MAJOR" not-null="true" precision="5" scale="0" sql-type="NUMBER"/>
  </property>
  <property name="versionMinor" type="integer">
   <column name="VERSION_MINOR" not-null="true" precision="5" scale="0" sql-type="NUMBER"/>
  </property>
  <many-to-one class="Offer" name="offer">
   <column name="ID_OFFER" not-null="true" precision="10" scale="0" sql-type="NUMBER"/>
  </many-to-one>
  <many-to-one class="PricelistStatus" name="status">
   <column name="ID_STATUS_PRICELIST" not-null="true" precision="10"
    scale="0" sql-type="NUMBER"/>
  </many-to-one>
  <property name="validFrom" type="calendar">
   <column name="INIT_TIMESTAMP" not-null="true" scale="6" sql-type="TIMESTAMP"/>
  </property>
  <property name="validUntil" type="calendar">
   <column name="END_TIMESTAMP" not-null="false" scale="6" sql-type="TIMESTAMP"/>
  </property>
 </class>
</hibernate-mapping>

我疯了。任何人都可以看到它应该复制到ID_OFFER列的引用吗?请注意:我的架构的两个表有一个名为:OFFERS.ID_OFFER的列,它是表OFFERS和PRICELIST.ID_OFFER的主键,它有一个引用外键约束,显然是OFFERS.ID_OFFER。

2 个答案:

答案 0 :(得分:1)

您忘了将此列映射为拥有方(Offer.hbm.xml文件)

<set name="pricelists" sort="unsorted" table="PRICELISTS">
   <key not-null="true">
      <column name="ID_OFFER" not-null="true" precision="10" scale="0" sql-type="NUMBER"/>
   </key>
   <one-to-many class="Pricelist"/>
</set>

应该看起来像(看inverse="true"):

<set name="pricelists" sort="unsorted" table="PRICELISTS" inverse="true">
   <key not-null="true">
      <column name="ID_OFFER" not-null="true" precision="10" scale="0" sql-type="NUMBER"/>
   </key>
   <one-to-many class="Pricelist"/>
</set>

答案 1 :(得分:0)

@zxcf说了什么,实际上让异常消失了,但又出现了另一个问题。为什么以下映射不会产生同样的问题?

<强> ServiceElement.hbm.xml

<hibernate-mapping>
 <class name="ServiceElement" table="SERVICE_ELEMENTS">
  <id name="idServiceElement" type="java.lang.Long">
   <column name="ID_SERVICE_ELEMENT" not-null="true" precision="10"
    scale="0" sql-type="NUMBER" unique="true"/>
   <generator class="native">
    <param name="sequence">SERVICE_ELEMENTS_SEQ</param>
   </generator>
  </id>
  <set name="prices" table="PRICES">
   <key>
    <column name="ID_SERVICE_ELEMENT" not-null="true" precision="10"
     scale="0" sql-type="NUMBER"/>
   </key>
   <one-to-many class="Price"/>
  </set>
 </class>
</hibernate-mapping>

<强> Price.hbm.xml

<hibernate-mapping>
 <class name="Price" table="PRICES">
  <id name="idPrice" type="java.lang.Long">
   <column name="ID_PRICE" not-null="true" precision="10" scale="0"
    sql-type="NUMBER" unique="true"/>
   <generator class="native">
    <param name="sequence">PRICES_SEQ</param>
   </generator>
  </id>
  <many-to-one class="ServiceElement" name="serviceElement">
   <column name="ID_SERVICE_ELEMENT" not-null="true" precision="10"
    scale="0" sql-type="NUMBER"/>
  </many-to-one>
 </class>
</hibernate-mapping>

是不是完全相同的映射?但它不会抛出任何异常。在这里他们去DDL:

CREATE TABLE "CE_PRICELIST"."OFFERS" 
(   "ID_OFFER" NUMBER(10,0), 
"NAME" VARCHAR2(255 CHAR));
CREATE UNIQUE INDEX "CE_PRICELIST"."OFFERS_PK" ON "CE_PRICELIST"."OFFERS" ("ID_OFFER");
ALTER TABLE "CE_PRICELIST"."OFFERS" ADD CONSTRAINT "OFFERS_PK" PRIMARY KEY ("ID_OFFER");

CREATE TABLE "CE_PRICELIST"."PRICELISTS" 
(   "ID_PRICELIST" NUMBER(10,0), 
"ID_OFFER" NUMBER(10,0));
CREATE UNIQUE INDEX "CE_PRICELIST"."PRICELISTS_PK" ON "CE_PRICELIST"."PRICELISTS" ("ID_PRICELIST");
ALTER TABLE "CE_PRICELIST"."PRICELISTS" ADD CONSTRAINT "PRICELISTS_PK" PRIMARY KEY ("ID_PRICELIST");
ALTER TABLE "CE_PRICELIST"."PRICELISTS" ADD CONSTRAINT "PRICELISTS_OFFER_ID_FK" FOREIGN KEY ("ID_OFFER") REFERENCES "CE_PRICELIST"."OFFERS" ("ID_OFFER") ENABLE;

CREATE TABLE "CE_PRICELIST"."SERVICE_ELEMENTS" 
(   "ID_SERVICE_ELEMENT" NUMBER(10,0));
CREATE UNIQUE INDEX "CE_PRICELIST"."SERVICE_ELEMENTS_PK" ON "CE_PRICELIST"."SERVICE_ELEMENTS" ("ID_SERVICE_ELEMENT");
ALTER TABLE "CE_PRICELIST"."SERVICE_ELEMENTS" ADD CONSTRAINT "SERVICE_ELEMENTS_PK" PRIMARY KEY ("ID_SERVICE_ELEMENT");

CREATE TABLE "CE_PRICELIST"."PRICES" 
(   "ID_PRICE" NUMBER(10,0),  
"ID_SERVICE_ELEMENT" NUMBER(10,0));
CREATE UNIQUE INDEX "CE_PRICELIST"."PRICES_PK" ON "CE_PRICELIST"."PRICES" ("ID_PRICE");
ALTER TABLE "CE_PRICELIST"."PRICES" ADD CONSTRAINT "PRICES_SERVICE_ELEMENT_ID_FK" FOREIGN KEY ("ID_SERVICE_ELEMENT")
  REFERENCES "CE_PRICELIST"."SERVICE_ELEMENTS" ("ID_SERVICE_ELEMENT") ENABLE;

OFFERS在ID_OFFER上有一个PK,由PRICELISTS.ID_OFFER引用;优惠有一套&lt;价目表&gt ;; SERVICE_ELEMENTS在ID_SERVICE_ELEMENT上有一个PK,由PRICES.ID_SERVICE_ELEMENT引用; ServiceElement有一个Set&lt;价格&gt ;;

那么为什么在一种情况下需要逆属性而在另一种情况下不需要?