我在调用main方法时遇到异常。 我在这里发布映射文件。 我认为这是由于
<list-index>
<column name="bill_no" />
</list-index>
这个
应该有什么价值 <hibernate-mapping>
<class name="iland.hbm.BillDetails" table="bill_details" catalog="retail_shop">
<id name="billNo" type="java.lang.Long">
<column name="bill_no" />
<generator class="identity"></generator>
</id>
<many-to-one name="customerDetails" class="iland.hbm.CustomerDetails" fetch="join">
<column name="customer_id" not-null="true" />
</many-to-one>
<property name="subTotal" type="java.lang.Float">
<column name="sub_total" precision="10" />
</property>
<list name="billProductDetailses" table="bill_product_details" inverse="true" lazy="false" fetch="join">
<key>
<column name="bill_no" not-null="true" />
</key>
<list-index>
<column name="bill_no" />
</list-index>
<one-to-many class="iland.hbm.BillProductDetails" />
</list>
</class>
</hibernate-mapping>
错误:
Initial SessionFactory creation failed.org.hibernate.MappingException: Repeated column in mapping for collection: iland.hbm.BillDetails.billProductDetailses column: bill_no
Exception in thread "main" java.lang.ExceptionInInitializerError
at iland.database.HibernateUtil.<clinit>(HibernateUtil.java:32)
at iland.bill.BillDAO.fetchAll(BillDAO.java:94)
Caused by: org.hibernate.MappingException: Repeated column in mapping for collection: iland.hbm.BillDetails.billProductDetailses column: bill_no
at org.hibernate.mapping.Collection.checkColumnDuplication(Collection.java:341)
at org.hibernate.mapping.Collection.checkColumnDuplication(Collection.java:354)
如何解决上述错误。
答案 0 :(得分:0)
实际上,您要在实体中映射两次相同的列。
<list name="billProductDetailses" table="bill_product_details" inverse="true" lazy="false" fetch="join">
<key>
<column name="bill_no" not-null="true" />
</key>
<list-index>
<column name="bill_no" />
</list-index>
<one-to-many class="iland.hbm.BillProductDetails" />
</list>
当你在一个实体中映射两次相同的列(bill_product_details.bill_no)时(假设对象的属性A和B引用同一列),Hibernate会产生该异常,因为它不知道何时更新/插入db上的数据(当A被更改或B被更改时?如果A和B不同?),所以你必须告诉它哪一个是“主”,比如说。
另外,我要指出我不理解你的映射。 “key”应该映射到具有外键约束的列,而索引应该映射列,指示对象在列表/数组中的位置,所以我真的不明白为什么它们都引用同一列。这样,数组中对象的位置将等于引用条目的id。不是吗?