休眠不保留参照完整性



在休眠中,我在用户和角色之间创建了一对多关系。 一个角色可以关联多个用户,但一个用户只能与一个角色关联。

在用户类中,我有

@ManyToOne
@JoinColumn(name = "role_id")
private Role role_id;

在角色类中,我有

@OneToMany(mappedBy="role_id", fetch=FetchType.LAZY)
private Collection<User> userList = new ArrayList<User>();

如果我将新用户另存为:

{
"userName" : "Michael",
"role_id" : {
"id" : 8    
}
}

即使角色表没有id为8(并且没有在角色表中完成任何条目(。 我希望每当我保存具有不存在角色的用户时,我都应该收到引用完整性错误。 我应该更改什么?

"我的用户"表的创建方式为:

CREATE TABLE `users` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`email` varchar(255) DEFAULT NULL,
`mobile` varchar(255) DEFAULT NULL,
`username` varchar(255) NOT NULL,
`role_id` bigint(20) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `FK_abcdef` (`role_id`),
CONSTRAINT `FK_abcdef` FOREIGN KEY (`role_id`) REFERENCES `role` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

数据库中的表中是否有 FK 约束?也许如果你使用mySql可以帮助你。或者,您也可以自己在数据库中设置限制。

@OneToMany注释中,您可能需要添加targetEntity = User.class。 这是因为以下原因:

  1. Java 泛型使用类型擦除,这意味着在生成的字节码中,您的userListCollection类型,而不是Collection<User>类型。 因此,休眠不知道目标实体是什么,除非您明确告诉它。

  2. Hibernate通常喜欢遵循静默错误/隐藏错误方法,这意味着它会在问题发生的那一刻(例如,它不知道你的集合元素是什么类型的那一刻(默默地忽略问题,并在以后失败,当问题的原因不再很清楚时。 (例如,当您执行一个应该失败的查询时,它没有失败,或者您执行一个应该获取某些内容的查询,但它什么也没获取。

  3. 从java 9开始,编译器确实存储了有关在生成的.class文件中创建泛型字段时使用的实际类型参数的信息,并且可以使用反射发现该信息,但我不知道休眠已经更新以检查此信息。

最新更新