2015-09-26 95 views
1

我在該表中有表product其中一個外鍵dimension_id。所以在寫服務層的測試用例時,它會顯示錯誤。 這是我的測試案例非空屬性引用瞬態值瞬態實例必須在當前操作之前保存

@Transactional(propagation = Propagation.REQUIRED) 
    private ProductBO getProductBO() { 
     SellerBO sellerBO = getSellerBO(); 
     ProductBO productBO = new ProductBO(); 
     productBO.setCategoryId(1); 
     productBO.setDateAvailable("20/00/0000"); 
     productBO.setImage("a15cb5e"); 
     productBO.setLocation("for getting product details"); 
     productBO.setMinimum(26.00); 
     productBO.setModel("service"); 
     productBO.setPoints(5); 
     productBO.setPrice(12.2f); 
     productBO.setQuantity("2"); 
     productBO.setSellerBO(sellerBO); 
     productBO.setShipping(2); 
     productBO.setSku("aqaqaq"); 
     productBO.setSortOrder("aes"); 
     productBO.setStatus(1); 
     productBO.setStockStatusId("20"); 
     productBO.setProductName("Micromax"); 
     productBO.setSubtract(20.0001); 
     productBO.setUpc("asd"); 
     productBO.setViewed(2); 
     productBO.setWeight("25"); 
     productBO.setWeightClassBO(getWeightClassBO(productBO)); 
     productBO.setDimensionBO(getDimension()); 
     return productBO; 
    } 


public DimensionBO getDimension() { 
     DimensionBO dimensionBO = new DimensionBO(); 
     dimensionBO.setHeight(12); 
     dimensionBO.setLength(23); 
     dimensionBO.setWidth(14); 
     dimensionBO.setLengthClassBO(getLengthClass()); 
     try { 
      manageDimensionServiceImpl.addDimension(dimensionBO); 
     } catch (CrafartServiceException csExp) { 
      csExp.printStackTrace(); 
      Assert.fail(); 
     } 

     return dimensionBO; 

    } 

這是我dimensionimpl

@Override 
    @Transactional(propagation = Propagation.REQUIRED) 
    public void addDimension(DimensionBO dimensionBO) throws CrafartServiceException { 

     DimensionDO dimensionDO = beanMapper.mapDimensionBOToDO(dimensionBO, new DimensionDO(), beanMapper.mapLengthClassBOToDO(dimensionBO.getLengthCassBO(), new LengthClassDO())); 
     try { 

      dimensionDAOImpl.addDimension(dimensionDO); 
      dimensionBO.setDimensionId(dimensionBO.getDimensionId()); 
      //LengthClassDO lengthClassDO = lengthClassDAOImpl.getLengthClass(dimensionBO.getLengthCassBO().getLengthClassId()); 
      //dimensionDO.setLengthClassDO(lengthClassDO); 
     } catch (CrafartDataException e) { 
      throw new CrafartServiceException("Error while adding dimension", e); 

     } 

    } 

這是我dimensionDAOimpl

@Override 
    @Transactional(propagation = Propagation.REQUIRED) 
    public void addDimension(DimensionDO dimensionDO) throws CrafartDataException { 
     try { 
      Session session = this.getSessionFactory().getCurrentSession(); 
      session.persist(dimensionDO); 
     } catch (HibernateException hExp) { 
      throw new CrafartDataException("DB Error while adding dimension details in table", hExp); 
     } 
    } 

} 

DO博映射

public DimensionBO mapDimensionDOTOBO(DimensionDO dimensionDO,DimensionBO dimensionBO,LengthClassBO lengthClassBO) { 
     dimensionBO.setDimensionId(dimensionBO.getDimensionId()); 
     dimensionBO.setHeight(dimensionBO.getHeight()); 
     dimensionBO.setLength(dimensionBO.getLength()); 
     dimensionBO.setWidth(dimensionBO.getWidth()); 
     dimensionBO.setLengthClassBO(lengthClassBO); 
     return dimensionBO; 
    } 

博做映射

public DimensionDO mapDimensionBOToDO(DimensionBO dimensionBO, DimensionDO dimensionDO ,LengthClassDO lengthClassDO) { 
     dimensionDO.setDimensionId(dimensionDO.getDimensionId()); 
     dimensionDO.setHeight(dimensionDO.getHeight()); 
     dimensionDO.setLength(dimensionDO.getLength()); 
     dimensionDO.setWidth(dimensionDO.getWidth()); 
     dimensionDO.setLengthClassDO(lengthClassDO); 

     return dimensionDO; 
    } 

回答

0

你得到Not-null property references a transient value transient instance must be saved before current operation異常意味着,當你堅持dimensionDO對象,有是引用一個非持續(這是一個短暫的)對象THI對象的關係,因此可以不管理外鍵。

您的代碼無法顯示此關係的位置。也許當你從dimensioBO映射到dimensionDO時,你創建了一個你必須堅持過的新實例。

另一方面,在productBO中,您有兩個對新實例的引用,一個用於sellerBO,另一個用於dimensionBO。但你不顯示產品持久性的代碼...

+0

我會將我的dimensionBO添加到dimensionDO你能告訴我必須更改的位置 –

+0

似乎'dimensionDO'唯一的引用是'LengthClassDO'。這個對象之前是否持久?如果這個對象在你有三個選項之前沒有被持久化,那麼在之前堅持它,加載一個持久的entitiy或者配置級聯來調用'dimensionDO'持久性時觸發'LengthClassDO'持久性。 – malaguna

相關問題