2012-03-04 63 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