含@Any注解的Hibernate Entity更新时抛出NullPointerException
@Any注解多态关联更新时空指针异常的解决方案
问题根源
你遇到的空指针异常是因为GameScore类中@Any注解的配置错误:错误使用@JoinColumn来指定关联外键列,这种配置不符合Hibernate对@Any注解的解析要求,导致更新操作时Hibernate无法正确识别属性映射,进而抛出空指针。
正确配置方式
修正GameScore中player字段的注解,用@Column分别指定鉴别列和外键列,移除错误的@JoinColumn,或者直接通过@Any注解的属性来定义这两个列。
修正后的GameScore代码
package com.example.demo; import jakarta.persistence.*; import org.hibernate.annotations.Any; import org.hibernate.annotations.AnyDiscriminator; import org.hibernate.annotations.AnyDiscriminatorValue; import org.hibernate.annotations.AnyKeyJavaClass; @Entity public class GameScore { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Any @AnyDiscriminator(DiscriminatorType.STRING) @AnyDiscriminatorValue(discriminator = "P", entity = PcPlayer.class) @AnyDiscriminatorValue(discriminator = "C", entity = ConsolePlayer.class) @AnyKeyJavaClass(Long.class) @Column(name = "player_type") // 存储玩家类型的鉴别列 @Column(name = "player_id") // 存储玩家ID的外键列 private Player player; // Getter & Setter public Long getId() { return id; } public void setId(Long id) { this.id = id; } public Player getPlayer() { return player; } public void setPlayer(Player player) { this.player = player; } }
或者更简洁的写法(推荐):
@Any( discriminatorColumn = @Column(name = "player_type"), keyColumn = @Column(name = "player_id") ) @AnyDiscriminator(DiscriminatorType.STRING) @AnyDiscriminatorValue(discriminator = "P", entity = PcPlayer.class) @AnyDiscriminatorValue(discriminator = "C", entity = ConsolePlayer.class) @AnyKeyJavaClass(Long.class) private Player player;
关键注意点
- 数据库表
game_score必须包含player_type(字符串类型)和player_id(长整型)两个字段,不需要建立数据库外键约束,因为@Any是逻辑层面的多态关联。 - 更新操作前,确保
GameScore实例的player属性处于持久态或被正确加载,避免游离态实体引发的映射问题。 - 如果你使用的是Hibernate 6.x版本,部分注解属性可能有调整,可参考对应版本的官方文档确认细节。
内容的提问来源于stack exchange,提问作者RasAlGhul
相关产品推荐
相关产品推荐

