2012-03-04 6 views
0

私はまだHibernateを学んでおり、 "ManyToMany"リフレクションでデータベースをマップできるアプリケーションを開発する必要があります。 PRODUCT、SHOP、SHOP_PRODUCTの3つのテーブルがあります。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のフィールド「商品」によってマッピングされます。また、Shopエンティティでは、ShopProductsのコレクションは、ShopProductエンティティのフィールド "shop"によってマッピングされます。

ShopProductIdクラスは表示されていませんが、マッピングにエラーがあります。 AssociationOverridesは意味をなさない:あなたは他のクラスを拡張していないので、オーバーライドするものはない。

ShopProductはエンティティなので、他のエンティティの場合と同じように、簡単な作業を行い、1列の自動生成IDを使用する必要があります。

+0

ありがとうございます。私はエラーを見つけたばかりです。 ShopとProductクラスでは、 "mapped.by"の値を 'id.shop'と 'id.product'に変更する必要があります。また、ShopProduct.classから 'AssociationOverride'属性の値を変更する必要があります。 – user1166635

関連する問題