java - @ManyToOne 出错 - JPA/Hibernate 分离实体传递给 Persist
问题描述
晚上好,
我对使用 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。
解决方案
答案是对 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;
}
推荐阅读
- java - Google-fit API 同步问题测试用户 Android Studio
- mongodb - 安装了 mongodb,现在显示“连接被拒绝”错误?
- vba - SAP GUI 脚本 VBA,抓取性能助手文本
- php - 从下拉表单中获取输入并将其放入数据库 PHP
- python - Pandas 如何根据条件替换多个值的值
- javascript - 如何解构对象并使用键和值更新 MySQL?
- python - 将变量传入和传出 exec [因不清楚而关闭。已修改并重新上传]
- postgresql - 如何创建一个函数来重新索引前 X 个最差的 postgres 索引
- django - 如何在 django 模型中显式地建立反向foregnkey/1to1/MtoM 连接?
- r - 在 R 线性回归中处理嵌套变量