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

原因:org.hibernate.TransientObjectException:给定对象有一个空标识符:com.models.UserHibernate更新

慕容博涛
2023-03-14

我试图在数据库行中进行更新。我有这个例外

Caused by: org.hibernate.TransientObjectException: The given object has a null identifier: com.models.User
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.getUpdateId(DefaultSaveOrUpdateEventListener.java:270)

这是我从jsp文件提交操作的控制器代码

// create new user object
            User user = new User();
            user.setName(name);
            user.setEmail(email);
            user.setActive(false);
             _userDao.update(user);

这是我的dao,它定义了使用Hibernate会话工厂实用程序的更新

public void update(User user) {
        getSession().update(user);
    }

//edited:这是我对用户实体类的映射

 @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "userId")
    private Integer id;
    @Column(nullable = false)
    private String name;
    @Column(unique = false, nullable = false)
    private String email;
    @Column(nullable = true)
    private boolean active;

我无法更新电子邮件地址与jsp输入表单中输入的地址相同的用户记录。请帮帮忙,这是我第一次尝试用hibernate sessionfactory更新字段。

共有2个答案

李睿
2023-03-14

我在工作中遇到过更棘手的情况。正如@ByeBye所说,问题是试图更新一个以前没有持久化的实体。请参见以下示例

SalesOrder salesOrder = consignment.getSalesOrder();
    if (salesOrder != null) {
       // some code
    } 
    else{
        // 
        salesOrder = new SalesOrder();
        consignment.setSalesOrder(salesOrder);
    }
    salesOrderRepository.update(salesOrder); // hibernate update
    return salesOrder;
}
Here when the execution of code comes to else part. It try to create a new sales order object (where the object id is null ) and try to update it. And this cause the mentioned error.

因此,我的修复方法只是将更新更改为saveOrUpdate

        .......
        salesOrder = new SalesOrder();
        consignment.setSalesOrder(salesOrder);
    }
    salesOrderRepository.saveOrUpdate(salesOrder);
    return salesOrder;
}

因此,它命令hibernate首先持久化不存在的对象,然后对其进行所有更新(如果需要)。

希望这个场景能对大家有所帮助

胥智
2023-03-14

问题是您在不存在的实体上使用update方法。如果您想保存新创建的实体,您必须使用保存saveOrUpdate

update方法仅在实体已存在于数据库中时有效。

 类似资料:
  • 我在我的spring boot应用程序中出现了这个错误。当我想调用这个存储库时,我遇到了这个错误 这是我的存储库: 这就是我称之为此方法的地方: 如何检查方法返回的结果?我调试了我的代码,但在断点它只是返回这个错误。 谢谢你的帮助。

  • 问题内容: 这将类似于该方法。 我需要将无法控制的对象存储在一个集中,并确保只有两个对象实际上是同一对象(不包含相同的值)时,这些值才会被覆盖。 问题答案: 会帮你的忙。但我很好奇,对象集(按值组合对象)有什么问题? 对于您的特定问题,我可能会保留一组ID或包装对象。包装对象将包含一个引用,并按<==>进行比较。 还值得注意的是,Python对象也具有功能。该功能对于将对象放入集合或字典是必需的。

  • 我在使用spring数据从1对1关系btn表检索数据时遇到了一个问题。我已经回顾了平台上的几个解决方案,但奇怪的是,在问题首次出现之前,我已经实现了所有建议的解决方案。请帮助我找到我所缺少的东西,或是使对他人有用的解决方案对我无效的任何东西。 以下是这两个实体之间的关系 错误消息: 2021-12-23 15:02:42.116错误11144---[nio-8089-exec-5]o.a.c.c.

  • 我有一个实体:与实体:之间的关系如下: QueryParameter实体: HtmlElement实体: 组件实体: 类型实体: 基本上,这里的关系意味着一个html元素有一个与其相关的组件。 现在,当我想要找到如下所示的所有组件时: 它给出了以下错误: 如果我运行生成的查询,它将返回3行,但这没有任何意义,因为Component有不同的html组件(input、select等),并且HtmlEl

  • 在eclipse中调试时 退回申请。isEmpty()?空:应用程序。得到(0); 这些表达式被计算为 applications.is空()- 应用。获取(0)- 应用。大小()- 但在执行这一行之后,它的抛出错误 组织。冬眠HibernateeException:找到了多个具有给定标识符的行:263536, 即使它的大小显示为1,那么它为什么以及如何在执行后获得多行。

  • 问题内容: 我需要做一些实验,并且需要知道javascript中对象的某种唯一标识符,因此我可以查看它们是否相同。我不想使用相等运算符,我需要类似python中的id()函数的功能。 是否存在这样的东西? 问题答案: 更新 我下面的原始答案写在6年前,其风格与时代和我的理解相吻合。为了回应评论中的某些对话,一种更现代的方法如下: 如果您对旧版浏览器有要求,请在此处查看的浏览器兼容性。 原始答案保留