2015-09-26 43 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

相关问题