2016-01-20 67 views
0

我在我的数据库结构如下:休眠,试图访问孙子字段一对多的关系

enter image description here

我已经映射他们在Hibernate的配置文件是这样的:

<hibernate-mapping> 
    <class name="model.CartEntity" table="cart"> 
     <id name="id" type="int" column="id"> 
      <generator class="native" /> 
     </id> 
     <set name="products" table="cart_product_record" 
      inverse="true" lazy="false" fetch="select" cascade="save-update, delete"> 
      <key> 
       <column name="cart_id" not-null="false" /> 
      </key> 
      <one-to-many class="model.ProductRecordEntity" /> 
     </set> 
    </class> 
</hibernate-mapping> 

<hibernate-mapping> 
    <class name="model.ProductRecordEntity" table="product_record"> 
     <id name="id" type="int" column="id"> 
     <generator class="native"/> 
     </id> 
     <many-to-one name="product" class="model.ProductEntity" fetch="select" cascade="save-update, delete"> 
      <column name="product_id" /> 
     </many-to-one> 
     <many-to-one name="cart" class="model.CartEntity" fetch="select" cascade="save-update, delete"> 
      <column name="cart_id" not-null="true" /> 
     </many-to-one> 
    </class> 
</hibernate-mapping> 

<hibernate-mapping> 
    <class name="model.ProductEntity" table="product"> 
     <id name="id" type="int" column="id"> 
      <generator class="native" /> 
     </id> 
     <set name="productRecords" table="product_record_product" inverse="true" 
     lazy="false" fetch="select" cascade="save-update, delete"> 
      <key> 
       <column name="product_id" not-null="true" /> 
      </key> 
      <one-to-many class="model.ProductRecordEntity" /> 
     </set> 
    </class> 
</hibernate-mapping> 

我从数据库中检索具有所有产品记录的购物车,迄今为止没有问题,我正确地获取了所有必要的数据。

CartEntity cart = findById(id); 
List<ProductRecordEntity> productRecords = cart.getProductRecords(); 

问题是,当我尝试从产品记录得到的产品:

for (ProductRecordEntity productRecord: productRecords){ 
    ProductEntity product = productRecord.getProduct(); 
} 

我得到一个对象与它们的默认值,而不是从数据库中的信息的所有字段。

将实体保存到数据库中时,ID将正确填充。

产品记录表:

enter image description here

和产品表:

enter image description here

这些都是实体:

public class CartEntity { 

    private int id; 

    private Set<ProductRecordEntity> products = new HashSet<ProductRecordEntity>(); 

    public int getId() { 
     return id; 
    } 

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

    public Set<ProductRecordEntity> getProducts() { 
     return products; 
    } 

    public void setProducts(Set<ProductRecordEntity> products) { 
     this.products = products; 
    } 
} 


public class ProductRecordEntity { 
    private int id; 

    private CartEntity cart; 

    private ProductEntity product; 

    public CartEntity getCart() { 
     return cart; 
    } 

    public void setCart(CartEntity cart) { 
     this.cart = cart; 
    } 

    public ProductEntity getProduct() { 
     return product; 
    } 

    public void setProduct(ProductEntity product) { 
     this.product = product; 
    } 

    public int getId() { 
     return id; 
    } 

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


public class ProductEntity implements Serializable{ 
    private int id; 

    private Set<ProductRecordEntity> productRecords; 

    public Set<ProductRecordEntity> getProductRecords() { 
     return productRecords; 
    } 

    public void setProductRecords(Set<ProductRecordEntity> productRecords) { 
     this.productRecords = productRecords; 
    } 

    public int getId() { 
     return id; 
    } 

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

这是操作上的顺序数据库:

persist(cartEntity); 
    persist(productEntity); 

    productRecordEntity.setCartEntity(cartEntity); 
    cartEntity.getProducts().add(productRecordEntity); 

    productRecordEntity.setProduct(productEntity); 
    persist(productRecordEntity); 

    productEntity.getProductRecords().add(productRecordEntity); 
    update(productEntity); 

    update(cartEntity); 

任何想法我失踪了?我找不到问题出在哪里,我翻了两倍,三重检查了一切。

+0

能否请您发表您的产品模型类和DAO? –

回答

0

我通过向ProductOrder xml映射添加lazy =“false”来修复它。

<hibernate-mapping> 
    <class name="model.ProductOrderEntity" table="product_order"> 
     <id name="id" type="int" column="product_order_id"> 
      <generator class="native" /> 
     </id> 
     <property name="quantity" column="quantity" type="int" /> 
     <property name="price" column="price" type="java.lang.Float" /> 
     <many-to-one name="product" class="model.ProductEntity" 
     fetch="select" lazy="false"> 
      <column name="product_id" not-null="true" /> 
     </many-to-one> 
     <many-to-one name="order" class="model.OrderEntity" 
     fetch="select" lazy="false"> 
      <column name="order_id" not-null="true" /> 
     </many-to-one> 
    </class> 
</hibernate-mapping> 

我认为这是一个初始化的问题,从数据库中获取的产品记录时,我应该初始化产品领域,而会话仍然打开,就像这样:

Hibernate.initialize(product); 
1

对于CartEntity和ProductEntity映射,为什么使用关联表?你应该使用table =“product_record”。