Java Hibernate-1:N-保存子对象时,父对象将被复制

Java Hibernate-1:N-保存子对象时,父对象将被复制,java,hibernate,spring-mvc,one-to-many,cascade,Java,Hibernate,Spring Mvc,One To Many,Cascade,我知道这是我的错,问题是我一整天都没能解决它,很可能是一些简单的问题,也请忽略表名和列之间的关系,这是一个显示问题的示例项目 期望值: 沿父关系存储新的子对象(子对象有一列),而不再次存储父对象 错误: CascadeType.ALL导致父级重复,但尝试删除它以使用其他类型抛出:java.sql.SQLIntegrityConstraintViolationException:列“user\u id”不能为null 列“user\u id”是子表中存储父关系的列的名称 我将跳过一些注释,这

我知道这是我的错,问题是我一整天都没能解决它,很可能是一些简单的问题,也请忽略表名和列之间的关系,这是一个显示问题的示例项目


期望值:

沿父关系存储新的子对象(子对象有一列),而不再次存储父对象


错误:

CascadeType.ALL导致父级重复,但尝试删除它以使用其他类型抛出:java.sql.SQLIntegrityConstraintViolationException:列“user\u id”不能为null

列“user\u id”是子表中存储父关系的列的名称


我将跳过一些注释,这样就不会成为代码墙


用户实体

private Long id;
private String name;

@OneToMany(mappedBy = "user", fetch = FetchType.LAZY, cascade = {
        CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH})
private List<Username> usernameList = new ArrayList<>();
private Long id;
private String username;

@ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn(name = "user_id")
private User user;
同样,使用除CascadeType.All以外的任何东西都会出于某种原因抛出错误


UsernameDAO(这是用于存储子项username的方法,它复制父项user)

UsernameService

usernameDAO.save(username);

我相信您在对象用户名中分配对象用户的方式是不正确的。如果您正在做这样的事情:

User user = new User();
user.set(... // set your attributes

Username username = new Username();
username.set(user);
现在,如果保存
用户名
,hibernate将在数据库中为
用户
创建一个条目,因为创建
用户
的方式是使用
新建
关键字,这将在数据库中创建一个新条目

如果不想为
用户
创建新条目,则必须从数据库加载实体,因此应在服务类
用户
中添加新方法,该方法将返回给定用户id的用户

e、 g:


现在,当您保存
用户名
时,不会在表
用户
中创建新条目。这就是hibernate的工作方式。我们必须加载实体,然后对其执行操作并保存它。
new
关键字将创建一个新条目,即使实体的id(db中的主键)相同。

请告诉我回答自己的问题是否错误,因此我只删除此项

问题出在前端,我的Spring表单中有以下内容:

<form:select path="user" items="${listUsers}" />

应该是什么时候

<form:select path="user.id" items="${listUsers}" itemValue="id"/>


1) 如果未指定itemValue,Spring将从到字符串中获取值

2) 使用id字段(绑定实体)作为itemValue,使用关系字段id作为路径


3) 您不必删除类类型。只要您的实体由其唯一标识符(如id)绑定,就可以持久化以避免重复,否则hibernate会将其视为一个新条目。

请在保存操作之前记录用户名和用户实例并发布结果。@EugenCovaci我现在就这样做,我应该将其作为一种习惯谢谢你,但实际上它已经从数据库中加载了它们:(我将一个User数组传递给模型,然后将该数组绑定到Spring的
<form:select path="user" items="${listUsers}" />
<form:select path="user.id" items="${listUsers}" itemValue="id"/>