2014-07-06 5 views
2

최대 절전 모드 joined-subclass으로 클래스를 확장하고 싶습니다.Hibernate 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

먼저 그것이이 사실상 내가 구성 성분보다는 상속을 선호하는 자바 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

+0

안녕하세요, 문제를 해결했지만 현재 여기에 답변 할 시간이 없습니다. 하지만 제이. 내 솔루션은 귀하의 것과 비슷합니다. 그 아이디어는'Java - Persistence with Hibernate' (Listing 7.1)의'CategoryizedItem' 예제에서 나온 것입니다. –

+0

확실합니다 .. 그냥 anotate와 hibernate가 나머지를 할 것입니다 :) –

관련 문제