【问题标题】:Error with @ManyToOne - JPA/Hibernate Detached Entity Passed to Persist@ManyToOne 出错 - JPA/Hibernate 分离实体传递给 Persist
【发布时间】:2020-03-10 01:55:21
【问题描述】:

晚上好,

我对使用 Hibernate 比较陌生,遇到以下错误:

"message": "org.springframework.web.util.NestedServletException: Request processing failed; 
nested exception is org.springframework.dao.InvalidDataAccessApiUsageException: detached entity passed to persist: 
com.company.project.data.relational.models.ListsItems; nested exception is org.hibernate.PersistentObjectException: 
detached entity passed to persist: com.company.project.data.relational.models.ListsItems",

我有一个从具有嵌套对象的前端发送的 JSON 对象。我试图在 MySQL 的单独表中获取嵌套项,并使用原始对象 ID 建立关系。

以下是 JSON 的示例:

{
    "name":"Test",
    "type":"App Id List",
    "listItems":
    [
        {
            "id":1,
            "name":"Test",
            "value":" 1"
        },
        {
            "id":2,
            "name":"NEW TEST",
            "value":" 2"
        }
    ]
}

这是我的列表模型:

@Entity
@Getter
@Setter
@NoArgsConstructor
@Table(name = "lists")
public class Lists implements Serializable, OperationalEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @Column(columnDefinition = "char", nullable = false)
    private String guid;
    private String name;
    private String type;

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "listItems", orphanRemoval = true)
    @Cascade({org.hibernate.annotations.CascadeType.ALL, })
    private Set<ListsItems> listItems;

    private Date created;
    private Date updated;

}

这是我的 ListsItems 模型:

@Getter
@Setter
@Entity
@Table(name = "lists_items")
@NoArgsConstructor
public class ListsItems implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    private String name;
    private String value;

    @NaturalId
    @ManyToOne(optional = false, fetch = FetchType.EAGER)
    @JoinColumn(name = "lists_id", referencedColumnName = "id")
    private Lists listItems;

}

这里是保存功能:

@PostMapping(value = "/add")
    @PreAuthorize("hasRole('ADMIN')")
    public @ResponseBody WebResponse<W> create(@RequestBody W webModel) {
        D dbModel = asDbModel(webModel);
        dbModel.setGuid(UUID.randomUUID().toString());
        return WebResponse.success(createWebModelFromDbModel(getDatabaseEntityRepository().save(dbModel)));
    }

关于可能导致此错误的任何想法?我进行了一些搜索,但我尝试过的任何其他解决方案都没有成功。

提前致谢!
- 特拉维斯 W.

【问题讨论】:

  • 你能告诉我们你是如何保存实体的吗?
  • 当然!我把它加到了底部。
  • 错误很明显,您正在尝试保存一个明确设置了其标识 ID 的对象。
  • 不确定我会称之为“非常清楚”,但可以。除了从嵌套 JSON 中删除 ID 之外,我还可以通过以下建议修复它。

标签: java mysql spring hibernate jpa


【解决方案1】:

答案是对 ListItems 进行以下更改:

    @JsonIgnore // this import will be from jackson
    @NaturalId
    @ManyToOne(optional = false, fetch = FetchType.LAZY)
    @JoinColumn(name = "lists_id", referencedColumnName = "id")
    private Lists list;

以下是列表:

@OneToMany(fetch = FetchType.EAGER, mappedBy = "list", orphanRemoval = true)
    @Cascade({org.hibernate.annotations.CascadeType.ALL, })
    private Set<ListsItems> listItems;

我还需要迭代结果:

@Override
    protected Lists asDbModel(WebLists webModel) {
        Lists dbModel = new Lists();
        dbModel.setId(webModel.getId());
        dbModel.setName(webModel.getName());
        dbModel.setType(webModel.getType());
        dbModel.setListItems(webModel.getListItems());
        for(ListsItems item : webModel.getListItems()) {
            item.setList(dbModel);
        }
        return dbModel;

    }

【讨论】:

    猜你喜欢
    • 2016-10-20
    • 2017-10-21
    • 1970-01-01
    • 2023-03-20
    • 2012-09-20
    • 2012-11-02
    相关资源
    最近更新 更多