如何在JPA/Hibernate中用Integer/Long类型作为外键映射?
解决方案
直接修改字段的注解配置,移除用于实体关联的@OneToOne,改用普通字段注解并声明外键约束,这样既保留Long类型,又能保证外键的有效性:
@Column(name = "CREATED_BY", nullable = false, updatable = false) @ForeignKey(name = "FK_AUDIT_CREATED_BY") private Long createdBy;
为什么原来的代码会报错
你之前用@OneToOne注解标注Long类型字段,这个注解的作用是建立当前实体与User实体的一对一关联,Hibernate会自动尝试查询对应的User对象并赋值给该字段,但字段类型是Long,无法接收User对象,因此加载实体时会出现类型转换失败的错误。
为什么这个方案能解决性能问题
改成上述配置后,createdBy只是一个普通的数值型字段,Hibernate加载实体时不会触发任何与User表的关联查询,完全避免了你提到的大量连接导致的性能问题。在插入或更新实体时,你只需要直接设置用户ID的数值即可,不需要加载User实体,完全符合你的需求。
额外说明
- 数据库层面的外键约束会保证
CREATED_BY的值一定是User表中存在的USER_ID,无需担心数据有效性问题; - 如果需要在业务层提前校验用户ID的合法性,可以在插入/更新前查询User表做存在性检查,这一步可以根据业务需求选择是否添加。
内容的提问来源于stack exchange,提问作者Hashir Labs
相关产品推荐
相关产品推荐

