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→companynamefistname→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
相关产品推荐
相关产品推荐

