2014-05-08 75 views
0

我有這個例子,它的工作原理,我只是想修改它,但我不能這樣做。 這裏是例子的鏈接:我在這裏張貼到example link 總之:ManyToOne,oneToMany加入表

下面是實體來說的畫面: Entity-Relation

CREATE TABLE `stock` (
    `STOCK_ID` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 
    `STOCK_CODE` VARCHAR(10) NOT NULL, 
    `STOCK_NAME` VARCHAR(20) NOT NULL, 
    PRIMARY KEY (`STOCK_ID`) USING BTREE, 
    UNIQUE KEY `UNI_STOCK_NAME` (`STOCK_NAME`), 
    UNIQUE KEY `UNI_STOCK_ID` (`STOCK_CODE`) USING BTREE 
) 

CREATE TABLE `category` (
    `CATEGORY_ID` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 
    `NAME` VARCHAR(10) NOT NULL, 
    `DESC` VARCHAR(255) NOT NULL, 
    PRIMARY KEY (`CATEGORY_ID`) USING BTREE 
) 

CREATE TABLE `stock_category` (
    `STOCK_ID` INT(10) UNSIGNED NOT NULL, 
    `CATEGORY_ID` INT(10) UNSIGNED NOT NULL, 
    `CREATED_DATE` DATE NOT NULL, 
    `CREATED_BY` VARCHAR(10) NOT NULL, 
    PRIMARY KEY (`STOCK_ID`,`CATEGORY_ID`), 
    CONSTRAINT `FK_CATEGORY_ID` FOREIGN KEY (`CATEGORY_ID`) 
      REFERENCES `category` (`CATEGORY_ID`), 
    CONSTRAINT `FK_STOCK_ID` FOREIGN KEY (`STOCK_ID`) 
      REFERENCES `stock` (`STOCK_ID`) 
) 

這裏是Java類: Stock.java

package com.mkyong.stock; 

import java.util.HashSet; 
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 static javax.persistence.GenerationType.IDENTITY; 
import javax.persistence.Id; 
import javax.persistence.OneToMany; 
import javax.persistence.Table; 
import javax.persistence.UniqueConstraint; 

@Entity 
@Table(name = "stock", catalog = "mkyongdb", uniqueConstraints = { 
     @UniqueConstraint(columnNames = "STOCK_NAME"), 
     @UniqueConstraint(columnNames = "STOCK_CODE") }) 
public class Stock implements java.io.Serializable { 

    private Integer stockId; 
    private String stockCode; 
    private String stockName; 
    private Set<StockCategory> stockCategories = new HashSet<StockCategory>(0); 

    public Stock() { 
    } 

    public Stock(String stockCode, String stockName) { 
     this.stockCode = stockCode; 
     this.stockName = stockName; 
    } 

    public Stock(String stockCode, String stockName, 
      Set<StockCategory> stockCategories) { 
     this.stockCode = stockCode; 
     this.stockName = stockName; 
     this.stockCategories = stockCategories; 
    } 

    @Id 
    @GeneratedValue(strategy = IDENTITY) 
    @Column(name = "STOCK_ID", unique = true, nullable = false) 
    public Integer getStockId() { 
     return this.stockId; 
    } 

    public void setStockId(Integer stockId) { 
     this.stockId = stockId; 
    } 

    @Column(name = "STOCK_CODE", unique = true, nullable = false, length = 10) 
    public String getStockCode() { 
     return this.stockCode; 
    } 

    public void setStockCode(String stockCode) { 
     this.stockCode = stockCode; 
    } 

    @Column(name = "STOCK_NAME", unique = true, nullable = false, length = 20) 
    public String getStockName() { 
     return this.stockName; 
    } 

    public void setStockName(String stockName) { 
     this.stockName = stockName; 
    } 

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.stock", cascade=CascadeType.ALL) 
    public Set<StockCategory> getStockCategories() { 
     return this.stockCategories; 
    } 

    public void setStockCategories(Set<StockCategory> stockCategories) { 
     this.stockCategories = stockCategories; 
    } 

} 

StockCategory.java

package com.mkyong.stock;

import java.util.Date; 

import javax.persistence.AssociationOverride; 
import javax.persistence.AssociationOverrides; 
import javax.persistence.Column; 
import javax.persistence.EmbeddedId; 
import javax.persistence.Entity; 
import javax.persistence.JoinColumn; 
import javax.persistence.Table; 
import javax.persistence.Temporal; 
import javax.persistence.TemporalType; 
import javax.persistence.Transient; 

@Entity 
@Table(name = "stock_category", catalog = "mkyongdb") 
@AssociationOverrides({ 
     @AssociationOverride(name = "pk.stock", 
      joinColumns = @JoinColumn(name = "STOCK_ID")), 
     @AssociationOverride(name = "pk.category", 
      joinColumns = @JoinColumn(name = "CATEGORY_ID")) }) 
public class StockCategory implements java.io.Serializable { 

    private StockCategoryId pk = new StockCategoryId(); 
    private Date createdDate; 
    private String createdBy; 

    public StockCategory() { 
    } 

    @EmbeddedId 
    public StockCategoryId getPk() { 
     return pk; 
    } 

    public void setPk(StockCategoryId pk) { 
     this.pk = pk; 
    } 

    @Transient 
    public Stock getStock() { 
     return getPk().getStock(); 
    } 

    public void setStock(Stock stock) { 
     getPk().setStock(stock); 
    } 

    @Transient 
    public Category getCategory() { 
     return getPk().getCategory(); 
    } 

    public void setCategory(Category category) { 
     getPk().setCategory(category); 
    } 

    @Temporal(TemporalType.DATE) 
    @Column(name = "CREATED_DATE", nullable = false, length = 10) 
    public Date getCreatedDate() { 
     return this.createdDate; 
    } 

    public void setCreatedDate(Date createdDate) { 
     this.createdDate = createdDate; 
    } 

    @Column(name = "CREATED_BY", nullable = false, length = 10) 
    public String getCreatedBy() { 
     return this.createdBy; 
    } 

    public void setCreatedBy(String createdBy) { 
     this.createdBy = createdBy; 
    } 

    public boolean equals(Object o) { 
     if (this == o) 
      return true; 
     if (o == null || getClass() != o.getClass()) 
      return false; 

     StockCategory that = (StockCategory) o; 

     if (getPk() != null ? !getPk().equals(that.getPk()) 
       : that.getPk() != null) 
      return false; 

     return true; 
    } 

    public int hashCode() { 
     return (getPk() != null ? getPk().hashCode() : 0); 
    } 
} 

Stockcategoryid.java

package com.mkyong.stock; 

import javax.persistence.Embeddable; 
import javax.persistence.ManyToOne; 

@Embeddable 
public class StockCategoryId implements java.io.Serializable { 

    private Stock stock; 
    private Category category; 

    @ManyToOne 
    public Stock getStock() { 
     return stock; 
    } 

    public void setStock(Stock stock) { 
     this.stock = stock; 
    } 

    @ManyToOne 
    public Category getCategory() { 
     return category; 
    } 

    public void setCategory(Category category) { 
     this.category = category; 
    } 

    public boolean equals(Object o) { 
     if (this == o) return true; 
     if (o == null || getClass() != o.getClass()) return false; 

     StockCategoryId that = (StockCategoryId) o; 

     if (stock != null ? !stock.equals(that.stock) : that.stock != null) return false; 
     if (category != null ? !category.equals(that.category) : that.category != null) 
      return false; 

     return true; 
    } 

    public int hashCode() { 
     int result; 
     result = (stock != null ? stock.hashCode() : 0); 
     result = 31 * result + (category != null ? category.hashCode() : 0); 
     return result; 
    } 

} 

Category.java

package com.mkyong.stock; 

import java.util.HashSet; 
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 static javax.persistence.GenerationType.IDENTITY; 
import javax.persistence.Id; 
import javax.persistence.OneToMany; 
import javax.persistence.Table; 

@Entity 
@Table(name = "category", catalog = "mkyongdb") 
public class Category implements java.io.Serializable { 

    private Integer categoryId; 
    private String name; 
    private String desc; 
    private Set<StockCategory> stockCategories = new HashSet<StockCategory>(0); 

    public Category() { 
    } 

    public Category(String name, String desc) { 
     this.name = name; 
     this.desc = desc; 
    } 

    public Category(String name, String desc, Set<StockCategory> stockCategories) { 
     this.name = name; 
     this.desc = desc; 
     this.stockCategories = stockCategories; 
    } 

    @Id 
    @GeneratedValue(strategy = IDENTITY) 
    @Column(name = "CATEGORY_ID", unique = true, nullable = false) 
    public Integer getCategoryId() { 
     return this.categoryId; 
    } 

    public void setCategoryId(Integer categoryId) { 
     this.categoryId = categoryId; 
    } 

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

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

    @Column(name = "[DESC]", nullable = false) 
    public String getDesc() { 
     return this.desc; 
    } 

    public void setDesc(String desc) { 
     this.desc = desc; 
    } 

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.category") 
    public Set<StockCategory> getStockCategories() { 
     return this.stockCategories; 
    } 

    public void setStockCategories(Set<StockCategory> stockCategories) { 
     this.stockCategories = stockCategories; 
    } 

} 

現在我想的股票只有一個類別,所以basicaly我不得不從@OneToMany改變庫存.java到ManyToOne,但如果我只是改變,它給了我錯誤。 有人可以幫助我,請。

它應該是這樣的:

@ManyToOne(fetch = FetchType.LAZY, mappedBy = "pk.stock", cascade=CascadeType.ALL) 
private StockCategory stockgatery; 

//setter and getter methods 
//or something like 
@ManyToOne 
@JoinColumn(name="pk.stock" 

但我無法弄清楚。

+0

什麼異常你得到? –

+0

引起:org.hibernate.AnnotationException:引用的外鍵具有錯誤的列數 –

回答

0

嘗試這樣的事情......下面

@ManyToOne @JoinColumns({ @JoinColumn(name = "STOCK_ID", referencedColumnName = "STOCK_ID"), 
@JoinColumn(name = "CATEGORY_ID", referencedColumnName = "CATEGORY_ID") }) 
private StockCategory stockCategory;