当前位置: 首页 > 知识库问答 >
问题:

JPA合并错误:"org.hibernate.瞬态属性值异常:对象引用未保存的瞬态实例-"

江宏放
2023-03-14

更新父实体时出现以下错误:请注意,在持久化新的父子实体时没有错误,只有在合并操作时才会发生错误。

组织。冬眠TransientPropertyValueException:对象引用未保存的临时实例-在刷新之前保存临时实例:

以下是我的实体结构:

public class Vendor implements Serializable {

    private static final long serialVersionUID = 4681697981214145859L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "vendor_id")
    private Long vendorId;

    @Column(name = "biz_type")
    private String bizType;

    ...

    @OneToMany(mappedBy = "vendor", fetch = FetchType.LAZY, cascade = { CascadeType.PERSIST, CascadeType.MERGE })
    private Set<VendorAddress> vendorAddresses;
}

> public class VendorAddress implements Serializable {

    private static final long serialVersionUID = 227762450606463794L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "vendor_adrs_id")
    private Long vendorAdrsId;

    @Column(name = "vend_adrs_ordinal")
    private Integer vendAdrsOrdinal;

    // bi-directional many-to-one association to City
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "city_id")
    private City city;

    // bi-directional many-to-one association to State
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "state_id")
    private State state;

    // bi-directional many-to-one association to Country
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "country_id")
    private Country country;

    ....

    // bi-directional many-to-one association to Vendor
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "vendor_id")
    private Vendor vendor;
}

使用DTO通过网络向客户端发送数据,并使用Dozer映射工具将数据从实体复制到DTO。

下面是保存Vendor及其地址的EJB方法。Cascade选项设置为CascadeType。PERSIST,因此子实体供应商地址也与父实体供应商一起保存。//正在保存新供应商,没有任何错误。

@Override
public VendorTO saveVendor(VendorTO vendorTo) throws ErpMiniAppException {

    if (vendorTo.getVendorAddresses() != null) {
        Iterator<VendorAddressTO> iter = vendorTo.getVendorAddresses().iterator();
        if (iter.hasNext()) {
            VendorAddressTO addressTo = iter.next();
            addressTo.setVendAdrsOrdinal(1); // for new Vendor, address ordinal starts with 1
        } else
            throw new ErpMiniAppException("Address details no associated with Vendor.");
    } else {
        throw new ErpMiniAppException("Address details no associated with Vendor.");
    }

    Vendor vendor = (Vendor) ErpMiniMapper.getEntity(vendorTo, new Vendor());
    Vendor persistedVendor = daoFactory.getVendorDAO().insert(vendor);
    _logger.debug("InventoryServiceImpl :: saveVendor() new Entity inserted success!");
    return (VendorTO) ErpMiniMapper.getTO(persistedVendor, new VendorTO());
}

更新供应商及其地址的EJB方法。“级联”选项设置为“级联类型”。合并,但在提交事务期间引发异常。

@Override
public VendorTO updateVendor(VendorTO vendorTo) throws ErpMiniAppException {
    _logger.debug("VendorTO details to be updated -> " + vendorTo.toString());
    Vendor vendor = (Vendor) ErpMiniMapper.getEntity(vendorTo, new Vendor());
    Vendor updatedVendor = daoFactory.getVendorDAO().update(vendor);
    _logger.debug("Entity updated success!");
    return (VendorTO) ErpMiniMapper.getTO(updatedVendor, new VendorTO());
}

原因:java。lang.IllegalStateException:org。冬眠TransientPropertyValueException:对象引用未保存的临时实例-在刷新之前保存临时实例:com。是的。企业资源计划服务器达尔。实体。供应商地址。卖主-

因此,我检查集合VendorAddress是否为空,并且是否存在于父实体Vendor中。子实体供应商地址存在于父实体供应商中,因为您可以看到两个主键都存在:Vendor\u id-

InventoryServiceImpl。java:265)-供应商详情待更新-

尝试使用级联选项CascadeType。所有,得到相同的例外。是什么导致异常将其标记为瞬态实体?


共有1个答案

汪同
2023-03-14

您在供应商供应商地址之间有双向关联。将供应商地址添加到供应商时。供应商地址您还必须致电供应商地址。设置供应商

public void addAddressToVendor(VendorAddress address){
   this.vendorAddresses.add(address);
   address.setVendor(this)
}

 类似资料:
  • 我目前正在做一个项目,我遇到了这个错误: 发生了什么:1。)我在登录后设置了一个会话范围变量,比如SessionScopeVariableA。 2.)然后我有一个页面,我在其中添加一个实体,比如EntityA。 3.)EntityA有一个惰性字段sessionScopeVariableA,所以当我调用add方法时,我必须设置这个变量。 4.)请注意,SessionScopeVariableA被包装

  • 对象引用未保存的瞬态实例 - 在刷新错误之前保存瞬态实例 我有 3 个实体。我将使用一对多关系映射彼此实体。 产品收费详情有 燃料类型有 计算类型具有 我有一个问题,当我保存产品时,它抛出这样一个错误。我试着用@ManyToOne(cascade = CascadeType。ALL)到productChargeDetail,但是当我保存一个产品时,它显示一个来自应用程序的错误复制错误。FuelTy

  • 对象引用未保存的临时实例-在刷新之前保存临时实例。 我有一个2类组织实体和应用实体。组织和应用程序有多对多的关系。 组织实体 申请实体有 组织运作impl。JAVA 我的问题是,我是否使用applicationRepository保存applicationEntity。save(applicationEntity)也会像我的cascade类型一样保存组织。所有的一切都在现场定义。我犯了这个错误。

  • 我有一个数据库,有两个表Batchstatistics和ReconProcessDateTracker。我想了解他们之间的关系。我使用以下模型类使用hibernate实现这一点: } } 当我试图保存它时,我得到的错误对象引用了一个未保存的瞬态实例——在刷新之前保存瞬态实例:com。美国药典。实体TBLBatch统计

  • 我有以下错误, 对象引用未保存的瞬态实例-在刷新之前保存瞬态实例:Nominee;嵌套异常是java.lang.IllegalStateException:org.hibernate.transientObjectException:对象引用未保存的瞬态实例-在刷新前保存瞬态实例:Nominee对象引用未保存的瞬态实例-在刷新前保存瞬态实例 所以在这里,当我获取employee对象时,我想要将指定

  • 我正在Hibernate中尝试延迟加载实体,但无法克服上面的错误。我基本上在玩2个实体:用户和角色: 然后我有一个创建User实体的action bean,我们称之为方法1: 然后,在设置角色和更新之前,我尝试先持久化用户实体,但也失败了: 请注意: 用户服务。创建=持续 以下是完整的错误日志: