Java Hibernate不保留引用完整性

Java Hibernate不保留引用完整性,java,hibernate,orm,Java,Hibernate,Orm,在hibernate中,我创建了用户和角色之间的一对多关系。 一个角色可以关联多个用户,但一个用户只能关联一个角色 在用户类中,我有 @ManyToOne @JoinColumn(name = "role_id") private Role role_id; @OneToMany(mappedBy="role_id", fetch=FetchType.LAZY) private Collection<

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

在用户类中,我有

            @ManyToOne
            @JoinColumn(name = "role_id")
            private Role role_id;
    @OneToMany(mappedBy="role_id", fetch=FetchType.LAZY)
    private Collection<User> userList = new ArrayList<User>();
在角色课上,我有

            @ManyToOne
            @JoinColumn(name = "role_id")
            private Role role_id;
    @OneToMany(mappedBy="role_id", fetch=FetchType.LAZY)
    private Collection<User> userList = new ArrayList<User>();
即使角色表中没有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
。这是因为以下原因:

  • java泛型使用类型擦除,这意味着在生成的字节码中,
    userList
    属于类型
    Collection
    ,而不是类型
    Collection
    。因此,hibernate不知道目标实体是什么,除非您明确告诉它

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

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


  • 谢谢loannis,但我设置了外键约束。请参阅更新的answerJPA规范要求
    targetEntity
    仅针对原始集合,它应该能够获得泛型类型。我相信这不是必需的。@fg78nc如果是这样,我将删除我的答案。但我相信这就是它在过去对我起作用的原因,我看到很多代码使用
    targetEntity
    而没有原始集合,所以我当然希望OP能尝试一下。我刚才说
    targetEntity
    的目的是按照规范进行原始集合。如果对你有用,那没关系,让他试试。请告诉我你到底是怎么坚持的?