我知道这是我的错,问题是我整天都无法修复它,这很可能很简单,困扰着我,也请忽略关于表名和列的关系,这是一个示例项目来显示问题。
预期:
沿其父关系存储新子项(该子项有一个列),而无需再次存储父项。
错误:
CascadeType.ALL导致父级重复,但是尝试删除它以使用其他类型抛出: java.sql.SQLIntegrityConstraintViolationException:列“ user_id”不能为null
列“ user_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(这是用于存储子用户名的方法,该方法复制了父用户user)
Session session = factory.getCurrentSession();
session.save(username);
用户名服务
usernameDAO.save(username);
我相信您在对象Username中分配对象User的方式不正确。如果您正在执行以下操作:
User user = new User();
user.set(... // set your attributes
Username username = new Username();
username.set(user);
现在,如果您保存了username,hibernate将在数据库中创建一个条目,user因为您创建的方式user是使用new关键字,这将在db中创建一个新条目。
如果您不想为新建一个条目user,则必须从数据库中加载该实体,因此您应该在服务类中添加一个新方法,User该方法将为您返回一个给定用户ID的用户。
例如:
User user = userService.getUser(10);
Username username = new Username();
username.set(user);
现在,当您保存时username,这不会在表中创建新条目User。这就是休眠的方式。我们必须加载实体,然后对其进行操作并保存。new即使实体的ID(db中的主键)相同,关键字也会创建一个新条目。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。