当前位置: 首页 > 面试题库 >

保存子数据时传递的分离实体可持久保存

易扬
2023-03-14
问题内容

提交表单时出现此错误:

org.hibernate.PersistentObjectException:分离的实体传递给持久化:com.project.pmet.model.Account;
嵌套异常是javax.persistence.PersistenceException:org.hibernate.PersistentObjectException:传递给持久对象的分离实体:com.project.pmet.model.Account

这是我的实体:

帐户:

@Entity
@DynamicInsert
@DynamicUpdate
public class Account {

    @Id
    @GeneratedValue
    private Integer id;

    @Column(nullable = false)
    private String login;

    @Column(nullable = false)
    private String password;

    @Column(nullable = false)
    private String email;

    @ManyToOne
    @JoinColumn(name = "team_id")
    private Team team;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "owner")
    private List<Team> ownedTeams;

    ...

球队:

@Entity
@DynamicInsert
@DynamicUpdate
public class Team {

    @Id
    @GeneratedValue
    private Integer id;

    @Column(nullable = false)
    private String name;

    @ManyToOne
    @JoinColumn(name = "owner_id", nullable = false)
    private Account owner;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "team")
    private List<Account> members;

    ...

这是控制器的一部分:

    @ModelAttribute("team")
    public Team createTeamObject() {
        return new Team();
    }

    @RequestMapping(value = "/teams/create-team", method = RequestMethod.GET)
    public String getCreateTeam(@ModelAttribute("team") Team team, Principal principal) {
        logger.info("Welcome to the create team page!");

        Account owner = accountService.findOneByLogin(principal.getName());
        team.setOwner(owner);
        team.setMembers(new AutoPopulatingList<Account>(Account.class));

        return "teams";
    }

    @RequestMapping(value = "/teams/create-team", method = RequestMethod.POST)
    public String postCreateTeam(@ModelAttribute("team") Team team) {
        logger.info("Team created!");

        teamService.save(team);

        return "redirect:/teams.html";
    }

以及形式:

<form:form commandName="team" id="teamForm">
      <div class="form-group">
          <label>Name</label>
          <form:input path="name" cssClass="form-control" />
      </div>
      <div class="form-group" id="row-template">
          <label>Members</label>
          <form:select path="members[0].id" cssClass="form-control" data-live-search="true" >
             <form:options items="${accounts}" itemValue="id" />
          </form:select>
          ...
      </div>
   <form:hidden path="owner.id" />
</form:form>

我究竟做错了什么?


问题答案:
teamService.save(team);

Save方法仅接受临时对象。您可以在这里找到什么是瞬态对象

Transient - an object is transient if it has just been instantiated using the new operator, and it is not associated with a Hibernate Session. It has no persistent representation in the database and no identifier value has been assigned. Transient instances will be destroyed by the garbage collector if the application does not hold a reference anymore. Use the Hibernate Session to make an object persistent (and let Hibernate take care of the SQL statements that need to be executed for this transition).

您正在获取Team对象,并尝试将其持久化到数据库中,但是该对象中包含Account对象,并且该Account对象已分离(意味着该对象的实例已保存到DB中,但该对象不在会话中)。Hibernate正在尝试保存它,因为您已指定:

@OneToMany(cascade = CascadeType.ALL, ....

因此,有几种方法可以解决它:

1)不要使用CascadeType.ALL配置。帐户对象可用于团队数(至少域结构允许),并且更新操作可能会更新所有团队的帐户-
这意味着此操作不应在团队更新时启动。如果确实需要使用MERGE /
DELETE配置,我将从那里删除级联参数(默认值是不执行级联操作)。但是,如果您确实需要坚持下去,请参阅选项#2

2)使用“ saveOrUpdate()”方法代替“ save()”。“
saveOrUpdate()”方法接受瞬态和分离的对象。但是这种方法的问题在于设计:在保存团队对象时,您真的需要插入/更新帐户吗?我将其分为两个操作,并阻止从团队更新Account。

希望这可以帮助。



 类似资料:
  • 我在提交表单时遇到以下错误: org.hibernate.PersistentObjectException:传递给Persisted的分离实体:com.project.pmet.model.Account;嵌套异常为javax.persistence.persistenceException:org.hibernate.persistentObjectException:传递到persist的分

  • 我正在使用springboot jpa存储库保存方法 这是完整的错误:2020-06-09 15:49:02.371[nio-8080-exec-4]。M.M.A.ExceptionHandlerExceptionResolver:由处理程序执行导致的解析异常:org.springframework.dao.invalidDataAccessapiusageException:传递给persist

  • 问题内容: 我有一个JPA持久对象模型,其中包含多对一关系:一个具有许多。A 有一个。 这是一段代码: 我能够创建一个对象,向其中添加事务,并正确地持久保存该对象。但是,当我 使用现有的已经持久化的Account 创建一个事务并持久化 该Transaction时 ,出现一个异常: 引起原因:org.hibernate.PersistentObjectException:传递给持久对象的分离实体:c

  • 我正试图实现与hibernate的许多单向关系。问题是,当我试图向数据库中添加一些值时,我遇到了以下错误: 运行时发生异常。null:InvocationTargetException:未能执行ApplicationRunner:传递给persist:dnd35cg的分离实体。模型DND类;嵌套的异常是org。冬眠PersistentObjectException:传递给persist:dnd35

  • 问题内容: 我已经成功用hibernate写了我的第一个主要的孩子例子。几天后,我再次使用它并升级了一些库。不知道我做了什么,但是我再也无法使它运行了。有人可以帮助我找出返回以下错误消息的代码中的错误吗: hibernate映射: 编辑: InvoiceManager.java 发票.java InvoiceItem.java 编辑: 从客户端发送的JSON对象: 编辑: 一些详细信息: 我试图通

  • 这个网站上没有一个类似的问题能够解决我的问题。 错误:org.hibernate.persistentobjectexception:传递给persist:healthcheckapi.model.checks的分离实体 示例JSON健康对象: 请注意,这两个对象的ID都是自动生成的,我认为这是问题的一部分。