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 に答える