You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

关键注意点

  1. 数据库表game_score必须包含player_type(字符串类型)和player_id(长整型)两个字段,不需要建立数据库外键约束,因为@Any是逻辑层面的多态关联。
  2. 更新操作前,确保GameScore实例的player属性处于持久态或被正确加载,避免游离态实体引发的映射问题。
  3. 如果你使用的是Hibernate 6.x版本,部分注解属性可能有调整,可参考对应版本的官方文档确认细节。

内容的提问来源于stack exchange,提问作者RasAlGhul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 08:23:39