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

Hibernate如何从JSON中识别正确的实体子类?

解决方案

问题核心不在Hibernate,而是Jackson不知道如何将JSON中的数据映射到Roles的子类——因为你的集合是Set<Roles>,默认情况下Jackson只会实例化父类Roles,后续Hibernate自然也只会处理父类数据,不会写入子类表。

按以下步骤修改:

1. 给父类Roles添加Jackson多态注解

Jackson需要明确规则来识别子类,在Roles类上添加多态配置注解,同时把鉴别器字段映射到实体中(否则JSON里的objectType无法被接收):

@Entity
@Table(name = "roles")
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "objectType", discriminatorType = DiscriminatorType.STRING)
// Jackson多态配置:指定用objectType字段识别子类
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "objectType")
@JsonSubTypes({
    @JsonSubTypes.Type(value = Person.class, name = "Person"),
    @JsonSubTypes.Type(value = Company.class, name = "Company")
})
public class Roles {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long uniqueId;

    private String city;

    // 映射鉴别器字段,设置insertable/updatable=false,交给Hibernate自动维护
    @Column(name = "objectType", insertable = false, updatable = false)
    private String objectType;

    // 省略getter/setter
}

2. 统一子类的鉴别器值大小写

你的Company类注解是@DiscriminatorValue("company")(小写),但JSON里传的是"Company"(大写),两者必须一致,修改Company类:

@Entity
@Table(name = "company")
@DiscriminatorValue("Company") // 和JSON中的值统一
public class Company extends Roles {
    private String companyname;
    // 省略getter/setter
}

3. 修正JSON中的拼写错误

原JSON存在两处拼写错误,会导致字段无法映射:

  • comopanyname → companyname
  • fistname → firstname

修正后的JSON:

{
    "title": "a Test",
    "roles": [
        {
            "objectType": "Company",
            "city": "Testcity",
            "companyname": "test inc."
        },
        {
            "objectType": "Person",
            "city": "Disney",
            "firstname": "Mickey",
            "lastname": "Maus"
        }
    ]
}

4. 逻辑说明

  • Jackson会根据JSON中的objectType字段,自动实例化对应的Person或Company子类
  • Hibernate接收到子类实例后,会自动维护鉴别器列objectType的值,同时将子类字段写入对应的关联表(person/company)
  • Roles类中的objectType字段设置了insertable=false, updatable=false,避免手动修改干扰Hibernate的鉴别器逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 07:55:19