2013-04-01 48 views
0

我想創建一個結構來使用Hibernate 4.1管理MYSQL中的產品。通常有兩種產品:SimpleProduct(僅包含描述和價格)和ComplexProduct(包含一個包含產品的額外列表)。Hibernate繼承 - 引用超類的結構

所以我創建了abstact類Product和派生類SimpleProduct和ComplexProduct。我認爲TABLE_PER_CLASS InheritanceType會很方便。

Product.java

@Entity 
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) 
public abstract class Product { 

    private long id; 
    private String description; 
    private BigDecimal price; 

    private Product parent; 


    protected Product() { 

    } 

    protected Product(String description, BigDecimal price) { 
     this.description = description; 
     this.price = price; 
    } 

    @Id 
    @GeneratedValue(strategy = GenerationType.TABLE) 
    @Column(name="ID") 
    public long getId() { 
     return id; 
    } 

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

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

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

    @Column(name="PRICE", precision=2, columnDefinition="DECIMAL(10,2)") 
    public BigDecimal getPrice() { 
     return price; 
    } 

    public void setPrice(BigDecimal price) { 
     this.price = price; 
    } 

    @Override 
    public String toString() { 
     return getDescription()+", "+getPrice()+"€"; 
    } 

} 

SimpleProduct.java

@Entity 
public class SimpleProduct extends Product { 

    public SimpleProduct() { 
     super(); 
    } 

    public SimpleProduct(String description, BigDecimal price) { 
     super(description,price); 
    } 

} 

ComplexProduct.java

@Entity 
public class ComplexProduct extends Product { 

    private List<Product> containedProducts; 

    public ComplexProduct() { 

    } 

    public ComplexProduct(String description, BigDecimal price, List<Product> containedProducts) { 
     super(description,price); 
     if (containedProducts == null) { 
      this.containedProducts = new ArrayList<Product>(); 
     } else { 
      this.containedProducts = containedProducts; 
     } 
    } 

    public ComplexProduct(String description, BigDecimal price) { 
     super(description,price); 
     this.containedProducts = new ArrayList<Product>(); 
    } 

    @OneToMany(targetEntity=Product.class, cascade=CascadeType.ALL, fetch=FetchType.LAZY) 
    public List<Product> getContainedProducts() { 
     return containedProducts; 
    } 

    public void setContainedProducts(List<Product> containedProducts) { 
     this.containedProducts = containedProducts; 
    } 

    public void addToProductList(Product p) { 
     this.containedProducts.add(p); 
    } 

} 

然後我試圖執行Teststructure:

SimpleProduct sp1 = new SimpleProduct("SimpleProduct1",new BigDecimal("2.99")); 
SimpleProduct sp2 = new SimpleProduct("SimpleProduct2",new BigDecimal("4.99")); 
SimpleProduct sp3 = new SimpleProduct("SimpleProduct3",new BigDecimal("3.99")); 

ComplexProduct cp1 = new ComplexProduct("ComplexProduct1",new BigDecimal("8.99")); 
cp1.addToProductList(sp2); 
cp1.addToProductList(sp3); 

HibernateUtil.persist(sp1); 
HibernateUtil.persist(sp2); 
HibernateUtil.persist(sp3); 

HibernateUtil.persist(cp1); 

HibernateUtil.shutdown(); 

這裏是persist方法:

public static void persist(Object o) { 
    Session session = getSessionFactory().openSession(); 
    Transaction tx = session.beginTransaction(); 

    session.persist(o); 
    tx.commit();       
} 

我知道,這個teststructure的堅持,方法是不很乾淨,但它僅僅是去測試。

的問題是,我得到當PROGRAMM正在執行一個異常HibernateUtil.persist(CP1):螺紋

異常「主要」 org.hibernate.PersistentObjectException:通過分離的實體堅持:產品

那麼,它有什麼問題呢?我該如何解決這個問題?

謝謝

回答

0

我已經找到了解決辦法:如果我使用session.save(O),而不是session.persist(O)它的作品!