无法在两个实体之间创建“多对多”关系

时间:2012-07-21 11:11:38

标签: java google-app-engine gwt entity-relationship

正如我在标题中引用的那样,我在谷歌应用引擎项目中有两个实体。第一个是“商店”,另一个是“产品”。在添加ManyToMany注释之前,实体经常存储但在关系添加之后,即使返回成功的消息,也无法存储实体!!

以下是实体:

Store.java

package com.cheapchase.server;

import java.util.Date;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
import javax.persistence.JoinTable;
import javax.persistence.JoinColumn;
import javax.persistence.UniqueConstraint;

@Entity
@Table(name="store", catalog="content", uniqueConstraints={
    @UniqueConstraint(columnNames = "STORE_NAME"),
    @UniqueConstraint(columnNames = "STORE_CODE")})
public class Store{

    private int storeCode;
    private Date dueDate;
    private String emailAddress;
    private String storeName;
    private String storeAddress;
    private String storeDescription;
    private String userId;
    private Long id;
    private Set<Product> product;

    public Store(){

    }

    public Store(String storeName, int storeCode){
        this.storeName = storeName;
        this.setStoreCode(storeCode);
    }

    public Store(String storeName, int storeCode, Set<Product> product){
        this.storeName = storeName;
        this.storeCode = storeCode;
        this.product = product;
    }

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "STORE_ID", unique = true, nullable = false)
    public Long getId() {
        return this.id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @Column(name="STORE_NAME", nullable=false)
    public String getStoreName() {
        return this.storeName;
    }

    public void setStoreName(String storeName) {
        this.storeName = storeName;
    }

    /*
     * Define the Many To Many relationship with product
     */
    @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinTable(name = "storae_product", catalog = "content", joinColumns = {
            @JoinColumn(name = "STORE_ID", nullable = false)},
            inverseJoinColumns = {@JoinColumn(name = "PRODUCT_ID", nullable = false)})
    public Set<Product> getProduct(){
        return this.product;
    }
    public void setProduct(Set<Product> product){
        this.product = product;
    }

    /*
     * Define the rest getters and setters
     */
    public Date getDueDate() {
        return dueDate;
    }

    public void setDueDate(Date dueDate) {
        this.dueDate = dueDate;
    }

    public String getEmailAddress() {
        return this.emailAddress;
    }

    public void setEmailAddress(String emailAddress) {
        this.emailAddress = emailAddress;
    }

    public String getStoreDescription() {
        return storeDescription;
    }

    public void setStoreDescription(String storeDescription) {
        this.storeDescription = storeDescription;
    }

    public String getStoreAddress() {
        return storeAddress;
    }

    public void setStoreAddress(String storeAddress) {
        this.storeAddress = storeAddress;
    }

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public int getStoreCode() {
        return storeCode;
    }

    public void setStoreCode(int storeCode) {
        this.storeCode = storeCode;
    }

    public String toString(){
        StringBuilder builder = new StringBuilder();
        builder.append("Store [dueDate=");
        builder.append(dueDate);
        builder.append(", name=");
        builder.append(storeName);
        builder.append(", description=");
        builder.append(storeDescription);
        builder.append("]");
        return builder.toString();

    }

}

Product.java

package com.cheapchase.server;

import java.util.Set;
import java.util.HashSet;

import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
import javax.persistence.Column;

import com.google.appengine.api.datastore.Blob;

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

    private Long productId;
    private String name;
    private String description;
    private int barCode;
    Blob image;
    private Set<Store> stores = new HashSet<Store>(0);

    public Product(){

    }
    public Product(String name, String description){
        this.name = name;
        this.description = description;
    }
    public Product(String name, String description, Set<Store> stores){
        this.name = name;
        this.description = description;
        this.stores = stores;
    }

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "PRODUCT_ID", unique = true, nullable = false)
    public Long getProductId(){
        return this.productId;
    }

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

    @Column(name = "NAME", nullable = false)
    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Column(name = "DESCRIPTION")
    public String getDescription() {
        return this.description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    @ManyToMany(fetch = FetchType.LAZY, mappedBy = "product")
    public Set<Store> getStore(){
        return this.stores;
    }

    public void setStore(Set<Store> store){
        this.stores = store;
    }

    public int getBarCode() {
        return barCode;
    }

    public void setBarCode(int barCode) {
        this.barCode = barCode;
    }

}

0 个答案:

没有答案