2

我想用 hibernates 扩展一个类joined-subclass

问题是,扩展类有一个复合键,而普通类只有一个普通主键(见图)。 在此处输入图像描述

是否可以选择实现这种类结构?

目前 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>

此致,

4

1 回答 1

0

首先,我认为在 Java OOP 中倾向于组合而不是继承是事实上的,正如您所看到的,仅在休眠中扩展类并不是一个好习惯。

据我了解,您想实现多对多关系,您可以这样做:

@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

于 2014-07-15T06:30:18.333 回答