我知道这个主题在很多时候都会讨论过,但我仍然遇到异常:外键必须与引用的主键具有相同的列数。 我正在使用Hibernate通过xml文件进行映射:
public class Product implements java.io.Serializable {
private static final long serialVersionUID = 1L;
private Integer idProduct;
private String titleProduct;
private String reference;
private String description;
private boolean deuxiemeMain;
private double prixUnitaire;
private double prixNegocier;
private boolean valider;
private Integer qteMinOrdred;
private String echantillonGratuit;
private Customer costumer;
private SubCategory subCategory;
private Order order;
private ProductType productType;
private Unity unity;
private byte[] image;
private Collection<Double> prices;
private Collection<Integer> quantities;
private Collection<String> keyWords;
public Product() {
// TODO Auto-generated constructor stub
}
public Integer getIdProduct() {
return idProduct;
}
public String getTitleProduct() {
return titleProduct;
}
public String getReference() {
return reference;
}
public String getDescription() {
return description;
}
public boolean isDeuxiemeMain() {
return deuxiemeMain;
}
public double getPrixUnitaire() {
return prixUnitaire;
}
public double getPrixNegocier() {
return prixNegocier;
}
public boolean isValider() {
return valider;
}
public Integer getQteMinOrdred() {
return qteMinOrdred;
}
public String getEchantillonGratuit() {
return echantillonGratuit;
}
public void setIdProduct(Integer idProduct) {
this.idProduct = idProduct;
}
public void setTitleProduct(String titleProduct) {
this.titleProduct = titleProduct;
}
public void setReference(String reference) {
this.reference = reference;
}
public void setDescription(String description) {
this.description = description;
}
public void setDeuxiemeMain(boolean deuxiemeMain) {
this.deuxiemeMain = deuxiemeMain;
}
public void setPrixUnitaire(double prixUnitaire) {
this.prixUnitaire = prixUnitaire;
}
public void setPrixNegocier(double prixNegocier) {
this.prixNegocier = prixNegocier;
}
public void setValider(boolean valider) {
this.valider = valider;
}
public void setQteMinOrdred(Integer qteMinOrdred) {
this.qteMinOrdred = qteMinOrdred;
}
public void setEchantillonGratuit(String echantillonGratuit) {
this.echantillonGratuit = echantillonGratuit;
}
public Customer getCostumer() {
return costumer;
}
public void setCostumer(Customer costumer) {
this.costumer = costumer;
}
public ProductType getProductType() {
return productType;
}
public void setProductType(ProductType productType) {
this.productType = productType;
}
public Collection<String> getKeyWords() {
return keyWords;
}
public void setKeyWords(Collection<String> keyWords) {
this.keyWords = keyWords;
}
public Unity getUnity() {
return unity;
}
public void setUnity(Unity unity) {
this.unity = unity;
}
public SubCategory getSubCategory() {
return subCategory;
}
public void setSubCategory(SubCategory subCategory) {
this.subCategory = subCategory;
}
public Order getOrder() {
return order;
}
public void setOrder(Order order) {
this.order = order;
}
public byte[] getImage() {
return image;
}
public void setImage(byte[] image) {
this.image = image;
}
public Collection<Double> getPrices() {
return prices;
}
public Collection<Integer> getQuantities() {
return quantities;
}
public void setPrices(Collection<Double> prices) {
this.prices = prices;
}
public void setQuantities(Collection<Integer> quantities) {
this.quantities = quantities;
}
}
产品类的我的映射文件是:
<hibernate-mapping>
<class name="modele.Product" table="PRODUCT">
<id name="idProduct" type="java.lang.Integer">
<column name="IDPRODUCT" />
<generator class="increment" />
</id>
<property name="titleProduct" type="java.lang.String">
<column name="TITLEPRODUCT" />
</property>
<property name="reference" type="java.lang.String">
<column name="REFERENCE" />
</property>
<property name="description" type="java.lang.String">
<column name="DESCRIPTION" />
</property>
<property name="deuxiemeMain" type="boolean">
<column name="DEUXIEMEMAIN" />
</property>
<property name="prixUnitaire" type="double">
<column name="PRIXUNITAIRE" />
</property>
<property name="prixNegocier" type="double">
<column name="PRIXNEGOCIER" />
</property>
<property name="valider" type="boolean">
<column name="VALIDER" />
</property>
<property name="qteMinOrdred" type="java.lang.Integer">
<column name="QTEMINORDRED" />
</property>
<property name="echantillonGratuit" type="java.lang.String">
<column name="ECHANTILLONGRATUIT" />
</property>
<many-to-one name="costumer" class="modele.Customer"
fetch="join">
<column name="COSTUMER" />
</many-to-one>
<many-to-one name="subCategory" class="modele.SubCategory"
fetch="join">
<column name="SUBCATEGORY" />
</many-to-one>
<many-to-one name="order" class="modele.Order" fetch="join">
<column name="ORDER" />
</many-to-one>
<many-to-one name="productType" class="modele.ProductType"
fetch="join">
<column name="PRODUCTTYPE" />
</many-to-one>
<many-to-one name="unity" class="modele.Unity" fetch="join">
<column name="UNITY" />
</many-to-one>
<primitive-array name="image" table="PRODUCT">
<key>
<column name="IDPRODUCT" />
</key>
<index></index>
<element type="byte">
<column name="IMAGE" />
</element>
</primitive-array>
<bag name="prices" table="PRODUCT" inverse="false" lazy="true">
<key>
<column name="IDPRODUCT" />
</key>
<element type="java.lang.Double">
<column name="PRICES" />
</element>
</bag>
<bag name="quantities" table="PRODUCT" inverse="false" lazy="true">
<key>
<column name="IDPRODUCT" />
</key>
<element type="java.lang.Integer">
<column name="QUANTITIES" />
</element>
</bag>
<bag name="keyWords" table="PRODUCT" inverse="false" lazy="true">
<key>
<column name="IDPRODUCT" />
</key>
<element type="java.lang.String">
<column name="KEYWORDS" />
</element>
</bag>
</class>
</hibernate-mapping>
我为此构造获得以下异常:
org.hibernate.MappingException:外键(FK185958CF30AA9EB1:PRODUCT [IDPRODUCT]))必须与引用的主键具有相同的列数(PRODUCT [IDPRODUCT,idx]) org.hibernate.mapping.ForeignKey.alignColumns(ForeignKey.java:90) org.hibernate.mapping.ForeignKey.alignColumns(ForeignKey.java:73) org.hibernate.cfg.Configuration.secondPassCompileForeignKeys(Configuration.java:1263) org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1170) org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1286) persistence.BaseDAO。(BaseDAO.java:21) persistence.BaseDAO.getInstance(BaseDAO.java:42) dao.SearchDAO.getListeProducts(SearchDAO.java:23) metier.SearchManager.getProduct(SearchManager.java:13) presentation.SearchProduct.doGet(SearchProduct.java:40) javax.servlet.http.HttpServlet.service(HttpServlet.java:624) javax.servlet.http.HttpServlet.service(HttpServlet.java:731) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)