Hibernate不保留引用完整性

时间:2017-07-25 07:17:04

标签: java hibernate orm

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

在User类中,我有

            @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;

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

  1. java泛型使用类型擦除,这意味着在生成的字节码中,userList的类型为Collection,而不是类型Collection<User>。所以,hibernate不知道目标实体是什么,除非你明确告诉它。

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

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