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"/>