2014-07-06 86 views
2

我想扩展与休眠类joined-subclass类。休眠与复合键的XML子类化

问题是,扩展类有一个组合键,普通类只有一个正常的主键(见图)。 enter image description here

有没有一个选项来实现这个类结构?

目前的hbm.xml看起来如此:

<?xml version="1.0"?> 
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
    <hibernate-mapping> 
<class name="Product" table="products" catalog="test"> 
    <id name="idProduct" type="java.lang.Integer"> 
     <column name="idProduct" /> 
     <generator class="identity" /> 
    </id> 
    <property name="nameProduct" type="string"> 
     <column name="name_Product" length="45" /> 
    </property> 
    <property name="descriptionProduct" type="string"> 
     <column name="description_Product" length="45" /> 
    </property> 
    <property name="price1Product" type="string"> 
     <column name="price1_Product" length="45" /> 
    </property> 
    <property name="price2Product" type="string"> 
     <column name="price2_Product" length="45" /> 
    </property> 
    <joined-subclass name="ProductWithSelectedPrice" extends="Product" table="category_has_product"> 
     <key> 
     <column name="Category_idCategory" /> 
     <column name="Product_idProduct" /> 
     </key> 
      <property name="price" type="java.lang.Integer" column="Product_selectedPrice" /> 
    </joined-subclass> 
    --> 
</class> 

最好的问候,

+0

我可以知道,为什么你需要这样的结构? Hibernate不允许''中的组合键。 – Amogh

+0

有没有另外一种方法来实现这个图?我需要一个结构来为类别中的产品选择价格(n:m) –

回答

0

,首先它是一个事实,我认为在Java的面向对象的青睐成分而不是继承和因为你可以看到它不是一个很好的习惯,只是在hibernate中扩展类。

据我了解,你想实现一个多对多的关系,你可以只是做这样的:

@Table("Category") 
public class Category implements Serializable { 

    long id; 
    ... 
    ... 

    @OneToMany(mappedBy = "category", cascade = { CascadeType.ALL }, orphanRemoval = true, fetch = FetchType.LAZY) 
    List<Category_has_Product> category_has_Product; 


    public List<Category_has_Product> getCategory_has_Product(){ 
     return this.category_has_Product 
    } 
} 
@Table("Product") 
public class Product implements Serializable { 

    long id; 
    ... 
    ... 

    @OneToMany(mappedBy = "product", cascade = { CascadeType.ALL }, orphanRemoval = true, fetch = FetchType.LAZY) 
    List<Category_has_Product> category_has_Product; 
} 

public class Category_has_Product implements Serializable { 

    @ManyToOne(optional = false) 
    Category category; 

    @ManyToOne(optional = false) 
    Product product; 

    public Product getProduct() { 
     return this.product; 
    } 
} 

所以现在你可以只是做了简单的像这样的

Category category = new CategoryService().findById(101L); 
List<Category_has_Product> category_has_Product = category.getCategory_has_Product(); 

和然后

Product product = category_has_Product.get(0).getProduct(); 

我希望它能帮助:d

+0

嗨,我已经解决了问题,但目前我没有时间在这里回答这个问题。但是,真好。我的解决方案与您的解决方案类似。这个想法来自'Java - 持久化与Hibernate'中的'CategorItem'示例(代码7.1) –

+0

当然,就是..刚好是正确的,而休眠将会完成剩下的工作:) –