2012-03-04 91 views
0

我一直在學習Hibernate,我需要開發可以映射數據庫與「ManyToMany」反射的應用程序。有3個表格:PRODUCT,SHOP,SHOP_PRODUCT。如何解決與Hibernate「mappedByReference」異常?

Product.class

@Entity 
@Table(name="PRODUCT") 
public class Product { 

    @Id @GeneratedValue @Column(name="PRODUCT_ID") 
    private Integer productId; 

    @Column(name="PRODUCT_NAME", length=50, nullable=false) 
    private String productName; 

    @Column(name="RECOMMENDED_PRICE", length=10, precision=2) 
    private BigDecimal recommendedPrice; 

    @OneToMany(fetch=FetchType.LAZY, mappedBy="shopProducts") 
    private Collection<ShopProduct> shopProducts; 

    public void setShopProducts(Collection<ShopProduct> shopProducts) { 
     this.shopProducts=shopProducts; 
    } 

    public Collection<ShopProduct> getShopProducts() { 
     return shopProducts; 
    } 

    public void setProductId(Integer productId) { 
     this.productId=productId; 
    } 

    public Integer getProductId() { 
     return productId; 
    } 

    public void setProductName(String productName) { 
     this.productName=productName; 
    } 

    public String getProductName() { 
     return productName; 
    } 

    public void setRecommendedPrice(BigDecimal recommendedPrice) { 
     this.recommendedPrice=recommendedPrice; 
    } 

    public BigDecimal getRecommendedPrice() { 
     return recommendedPrice; 
    } 
} 

Shop.class:

@Entity 
@Table(name="SHOP") 
public class Shop implements Serializable{ 

    @Id @GeneratedValue @Column(name="SHOP_ID") 
    private Integer shopId; 

    @Column(name="SHOP_NAME", length=50, nullable=false) 
    private String shopName; 

    @OneToMany(fetch=FetchType.LAZY, mappedBy="shopProducts") 
    private Collection<ShopProduct> shopProducts; 

    public Collection<ShopProduct> getShopProducts() { 
     return shopProducts; 
    } 

    public void setShopProducts(Collection<ShopProduct> shopProducts) { 
     this.shopProducts=shopProducts; 
    } 

    public Integer getShopId() { 
     return shopId; 
    } 

    public void setShopId(Integer shopId) { 
     this.shopId=shopId; 
    } 

    public String getShopName() { 
     return shopName; 
    } 

    public void setShopName(String shopName) { 
     this.shopName=shopName; 
    } 
} 

ShopProduct.class:

@Entity 
@Table(name="SHOP_PRODUCT") 
@AssociationOverrides({ 
    @AssociationOverride(name="shopProducts", [email protected](name="SHOP_ID")), 
    @AssociationOverride(name="shopProducts", [email protected](name="PRODUCT_ID")) 
}) 
public class ShopProduct implements Serializable{ 

    @EmbeddedId 
    private ShopProductId id; 

    @Column(name="PRODUCT_PRICE", length=10, precision=2) 
    private BigDecimal productPrice; 

    @Column(name="PRODUCT_COUNT", length=10) 
    private Integer productCount; 

    public void setShopProductId(ShopProductId id) { 
     this.id=id; 
    } 

    public ShopProductId getShopProductId() { 
     return id; 
    } 

    public void setShop(Shop shop) { 
     id.setShop(shop); 
    } 

    public void setProduct(Product product) { 
     id.setProduct(product); 
    } 

    public Shop getShop() { 
     return id.getShop(); 
    } 

    public Product getProduct() { 
     return id.getProduct(); 
    } 

    public void setProductPrice(BigDecimal productPrice) { 
     this.productPrice=productPrice; 
    } 

    public BigDecimal getProductPrice() { 
     return productPrice; 
    } 

    public void setProductCount(Integer productCount) { 
     this.productCount=productCount; 
    } 

    public Integer getProductCount() { 
     return productCount; 
    } 

    @Override 
    public boolean equals(Object o) { 

     if (this==o) { 
      return true; 
     } 

     if (o==null || this.getClass()!=o.getClass()) { 
      return false; 
     } 

     ShopProduct sp=(ShopProduct)o; 

     if (id!=null ? !id.equals(sp.getShopProductId()) : sp.getShopProductId()!=null) { 
      return false; 
     } 

     return true; 
    } 

    @Override 
    public int hashCode() { 

     return (id!=null ? id.hashCode() : 0); 
    } 
} 

ShoProductId.class:

@Entity 
@Table(name="SHOP_PRODUCT") 
@AssociationOverrides({ 
    @AssociationOverride(name="shopProducts", [email protected](name="SHOP_ID")), 
    @AssociationOverride(name="shopProducts", [email protected](name="PRODUCT_ID")) 
}) 
public class ShopProduct implements Serializable{ 

    @EmbeddedId 
    private ShopProductId id; 

    @Column(name="PRODUCT_PRICE", length=10, precision=2) 
    private BigDecimal productPrice; 

    @Column(name="PRODUCT_COUNT", length=10) 
    private Integer productCount; 

    public void setShopProductId(ShopProductId id) { 
     this.id=id; 
    } 

    public ShopProductId getShopProductId() { 
     return id; 
    } 

    public void setShop(Shop shop) { 
     id.setShop(shop); 
    } 

    public void setProduct(Product product) { 
     id.setProduct(product); 
    } 

    public Shop getShop() { 
     return id.getShop(); 
    } 

    public Product getProduct() { 
     return id.getProduct(); 
    } 

    public void setProductPrice(BigDecimal productPrice) { 
     this.productPrice=productPrice; 
    } 

    public BigDecimal getProductPrice() { 
     return productPrice; 
    } 

    public void setProductCount(Integer productCount) { 
     this.productCount=productCount; 
    } 

    public Integer getProductCount() { 
     return productCount; 
    } 

    @Override 
    public boolean equals(Object o) { 

     if (this==o) { 
      return true; 
     } 

     if (o==null || this.getClass()!=o.getClass()) { 
      return false; 
     } 

     ShopProduct sp=(ShopProduct)o; 

     if (id!=null ? !id.equals(sp.getShopProductId()) : sp.getShopProductId()!=null) { 
      return false; 
     } 

     return true; 
    } 

    @Override 
    public int hashCode() { 

     return (id!=null ? id.hashCode() : 0); 
    } 
} 

Main.class:

public class Main { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     Session session=new AnnotationConfiguration().configure().buildSessionFactory().openSession(); 
     //System.out.println(product.getShops().size()); 
    } 

} 

的hibernate.cfg.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" 
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 
<hibernate-configuration> 
<session-factory> 
    <property name="hibernate.connection.url">jdbc:mysql://localhost/shop_db</property> 
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 

    <property name="hibernate.connection.username">root</property> 
    <property name="hibernate.connection.password"></property> 
    <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property> 

    <mapping class="com.nda.hibernate.Product"/> 
    <mapping class="com.nda.hibernate.Shop"/> 
    <mapping class="com.nda.hibernate.ShopProduct"/> 
    <mapping class="com.nda.hibernate.ShopProductId"/> 
</session-factory> 
</hibernate-configuration> 

當我試着執行它時,我會已經得到這個異常:

Caused by: org.hibernate.AnnotationException: mappedBy reference an unknown target entity property: com.nda.hibernate.ShopProduct.shopProducts in com.nda.hibernate.Product.shopProducts 
    at org.hibernate.cfg.annotations.CollectionBinder.bindStarToManySecondPass(CollectionBinder.java:666) 
    at org.hibernate.cfg.annotations.CollectionBinder$1.secondPass(CollectionBinder.java:626) 
    at org.hibernate.cfg.CollectionSecondPass.doSecondPass(CollectionSecondPass.java:66) 
    at org.hibernate.cfg.Configuration.originalSecondPassCompile(Configuration.java:1587) 
    at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1362) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1727) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1778) 
    at com.nda.hibernate.Sessions.<clinit>(Sessions.java:14) 
    ... 1 more 

如何解決它?謝謝。

回答

2

mappedBy屬性是指:

這種關聯是雙向的。我不是該協會的主人。在另一側找到關聯的映射。另一面在協會的目標級別中,在以下屬性/字段下:<the value of the mappedBy attribute>

因此,在您的產品實體中,ShopProducts的集合由ShopProduct中的字段「product」映射。在Shop實體中,ShopProduct的集合由ShopProduct實體的「shop」字段映射。

您沒有向我們展示ShopProductId類,但是您的映射中存在其他錯誤。 AssociationOverrides沒有意義:你沒有擴展任何其他類,所以沒有什麼可以重寫。

由於ShopProduct是一個實體,因此您應該讓自己的生活更輕鬆,並使用單列自動生成的ID,就像您爲其他實體所做的一樣。

+0

謝謝。我剛剛發現錯誤。我應該將商店和產品類的「mappedby」值更改爲「id.shop」和「id.product」。此外,我需要從ShopProduct.class中更改'AssociationOverride'屬性的值。 – user1166635 2012-03-04 09:42:37

相關問題