非空属性引用了瞬态值,当前操作之前必须保存瞬态实例。

3

我有一个名为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到BO的映射

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;
    }

BO到DO的映射
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;
    }
1个回答

1
您所遇到的异常信息 Not-null property references a transient value transient instance must be saved before current operation 的意思是,在持久化 dimensionDO 对象时,该对象中存在一个引用未被持久化(即瞬态)的对象,因此无法管理外键关系。
您的代码并未显示出这个引用在哪里。可能是当您从 dimensioBO 映射到 dimensionDO 时,创建了一个新的实例,需要先进行持久化。
另一方面,在 productBO 中,您有两个对新实例的引用,一个是 sellerBO,另一个是 dimensionBO。但您没有展示产品持久化的代码...

我将我的dimensionBO添加到dimensionDO中,你能告诉我在哪里更改吗? - vijaykumar g
似乎dimensionDO唯一的引用是LengthClassDO。这个对象之前被持久化了吗?如果这个对象之前没有被持久化,你有三个选择:在持久化之前将其持久化、加载已持久化的实体或配置级联以在调用dimensionDO持久化时触发LengthClassDO持久化。 - malaguna

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接