Как исправить исключение "mappedByReference" с Hibernate? - PullRequest
0 голосов
/ 04 марта 2012

Я все еще изучаю Hibernate, и мне нужно разработать приложение, которое может отобразить базу данных с отражением «ManyToMany». Для этого есть 3 таблицы: PRODUCT, SHOP, SHOP_PRODUCT.

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", joinColumns=@JoinColumn(name="SHOP_ID")),
    @AssociationOverride(name="shopProducts", joinColumns=@JoinColumn(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", joinColumns=@JoinColumn(name="SHOP_ID")),
    @AssociationOverride(name="shopProducts", joinColumns=@JoinColumn(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

Как я могу это исправить? Спасибо.

1 Ответ

2 голосов
/ 04 марта 2012

Атрибуты mappedBy означают:

Эта ассоциация является двунаправленной. Я не владелец ассоциации. Найдите сопоставление ассоциации на другой стороне. Другая сторона находится в целевом классе ассоциации в следующем свойстве / поле: <the value of the mappedBy attribute>.

Таким образом, в вашей сущности Product коллекция ShopProducts отображается полем "product" в ShopProduct. А в сущности «Магазин» коллекция ShopProducts отображается полем «магазин» сущности ShopProduct.

Вы не показали нам класс ShopProductId, но у вас есть дополнительные ошибки в вашем отображении. AssociationOverrides не имеет смысла: вы не расширяете какой-либо другой класс, так что нечего переопределять.

Поскольку ShopProduct - это сущность, вам следует упростить свою жизнь и использовать автоматически генерируемый идентификатор из одной колонки, как и для других сущностей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...