@ManyToMany - 复合PK - 异常:org.hibernate.AnnotationException:外键引用的列数错误。应该是2

时间:2015-05-04 04:01:21

标签: hibernate jpa many-to-many composite-primary-key

我得到这样的例外......

create table product(
    productid int(12) not null AUTO INCREMENT,
    // other attributes
    PRIMARY KEY(productid)
);

create table seller(
    SellerID int(12) not null AUTO INCREMENT,
    // other attributes
    PRIMARY KEY(SellerID)
);

create table seller_product(
    SellerID int(12) not null AUTO INCREMENT,
    productid int(12) not null AUTO INCREMENT,
    // other attributes
    PRIMARY KEY(SellerID,productid),
    key `productid_fk` (`productid`),
    constraint `productid_fk` FOREIGN KEY (`productid`) REFERENCES `product` (`productid`),
    constraint `sellerid_fk` FOREIGN KEY (`sellerid`) REFERENCES `seller` (`SellerID`)
);

我正在开发一个网络应用程序,其中的方案是: 许多卖家都可以销售产品。

我正在努力实现:如果我加载产品对象,那么销售该产品的所有卖家都必须附带产品对象。

表格结构:

package com.mysite.model;

// all import statements

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

    @Id
    @Column(name="productid")
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private int productId;

    @ManyToMany(cascade = CascadeType.ALL, fetch=FetchType.EAGER)
    @JoinTable(name = "SELLER_PRODUCT", 
        joinColumns = { @JoinColumn(name = "productid")}, 
        inverseJoinColumns = { @JoinColumn(name="sellerid") })
    private Set<SellerProduct> seller;

    public Set<SellerProduct> getSeller() {
        return seller;
    }

    public void setSeller(Set<SellerProduct> seller) {
        this.seller = seller;
    }

    public int getProductId() {
        return productId;
    }

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

    // other variables and getter-setters
}

Java代码如下所示:

Product.java

package com.mysite.model;

// all import packages

@Entity
@Table(name="SELLER")
public class Seller {

    @Id
    @Column(name="SellerID")
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private int sellerId;

    @ManyToMany (mappedBy="seller")
    private Set<Product> products = new HashSet<Product>();

    public int getSellerId() {
        return sellerId;
    }

    public void setSellerId(int sellerId) {
        this.sellerId = sellerId;
    }

    public Set<Product> getProducts() {
        return products;
    }

    public void setProducts(Set<Product> products) {
        this.products = products;
    }

    // other variables and getter-setters

}

Seller.java

package com.mysite.model;

// all import packages 

@Entity
@Table(name="product")
public class SellerProduct {

    @EmbeddedId
    SellerProductId sellerProductId;

    public SellerProductId getSellerProductId() {
        return sellerProductId;
    }

    public void setSellerProductId(SellerProductId sellerProductId) {
        this.sellerProductId = sellerProductId;
    }

    // other variables and getter setters
}

SellerProduct.java

package com.mysite.model;

// all import packages

@Embeddable
public class SellerProductId { 
    @Column(name="productId")
    private int productId;

    @Column(name="sellerId")
    private int sellerId;

    public int getProductId() {
        return productId;
    }

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

    public int getSellerId() {
        return sellerId;
    }

    public void setSellerId(int sellerId) {
        this.sellerId = sellerId;
    }    
}

SellerProductId.java

mesos-slave.sh --master=xxxx:5050 --resources=ports:80
I0503 20:48:04.999114 2057073408 main.cpp:200] Starting Mesos slave
I0503 20:48:05.000370 243535872 slave.cpp:316] Slave resources: ports(*):80; cpus(*):8; mem(*):15360; disk(*):470848

我在某些映射中错了吗? (我试图在谷歌上搜索,但无法获得成功!)

任何人都可以帮忙????

1 个答案:

答案 0 :(得分:0)

最后,我得到了一个解决方案。 提示,我来自the sourceFirst Link

实际上,我试图在双向中实现多对多关系,并在中间表中添加一些附加列。 问题在于我的映射。 我按照Second Link链接中建议的方式完成了映射。