org.hibernate.MappingException: 无法确定以下类型: java.util.Map.



我在休眠中映射属性时遇到问题。我只想将设备(1 对多(映射到设备数据(多对 1(,反之亦然。

我的输出应该是:

表:设备 =id,设备(设备编号(,

表:设备数据 =id,device_id(锻造钥匙(,...

一切都是由json2ojo生成器生成的。

@Entity(name = "Device")
@Table(name = "device_devices")
public class Device {    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @JsonProperty
    private Long id;
    @JsonProperty("device")
    @Column(unique = true)
    private String device;
    @JsonIgnore
    private Map<String, Object> additionalProperties = new HashMap<String, Object>();
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "device", cascade = CascadeType.ALL, orphanRemoval = true, targetEntity = DeviceData.class)
    private List<DeviceData> deviceData = new ArrayList<>();
...
}
@Entity(name = "DeviceData")
@Table(name = "device_data")
public class DeviceData {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @JsonProperty
    private Long id;
...
    @JsonIgnore
    @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY, targetEntity = Device.class)
    @JoinColumn(name = "device_id", referencedColumnName = "id")
    private Device device;
    @JsonIgnore
    private Map<String, Object> additionalProperties = new HashMap<String, Object>();

   @JsonProperty("id")
    public Long getId(){
        return id;
    }
    @JsonIgnore
    public Device getDevice(){
        return device;
    }
    @JsonIgnore
    public void setDevice(Device device){
        this.device = device;
    }
...
...
    @JsonAnyGetter
    public Map<String, Object> getAdditionalProperties() {
        return this.additionalProperties;
    }
    @JsonAnySetter
    public void setAdditionalProperty(String name, Object value) {
        this.additionalProperties.put(name, value);
    }
}

错误:

org.hibernate.MappingException: Could not determine type for:
   java.util.Map, at table: device_data, for columns:
   [org.hibernate.mapping.Column(additionalProperties)]     at
   org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:456)  at
   org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:423)  at
   org.hibernate.mapping.Property.isValid(Property.java:226)    at
   org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:597)
    at org.hibernate.mapping.RootClass.validate(RootClass.java:265)     at
   org.hibernate.boot.internal.MetadataImpl.validate(MetadataImpl.java:329)
    at
   org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:461)
    at
   org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:710)
    at
   io.dropwizard.hibernate.SessionFactoryFactory.buildSessionFactory(SessionFactoryFactory.java:96)
    at
   io.dropwizard.hibernate.SessionFactoryFactory.build(SessionFactoryFactory.java:49)
    at
   io.dropwizard.hibernate.SessionFactoryFactory.build(SessionFactoryFactory.java:39)
    at
   io.dropwizard.hibernate.HibernateBundle.run(HibernateBundle.java:67)
    at
   io.dropwizard.hibernate.HibernateBundle.run(HibernateBundle.java:19)
    at io.dropwizard.setup.Bootstrap.run(Bootstrap.java:200)    at
   io.dropwizard.cli.EnvironmentCommand.run(EnvironmentCommand.java:42)
    at
   io.dropwizard.cli.ConfiguredCommand.run(ConfiguredCommand.java:87)
    at io.dropwizard.cli.Cli.run(Cli.java:78)   at
   io.dropwizard.Application.run(Application.java:93)

缺省情况下,JPA 尝试保留@Entity类的所有属性,但您可以使用@Transient注释忽略某些属性。在您的情况下,如果您不想在两个类中保留additionalProperties字段,则应将它们标记为@Transient

@JsonIgnore
@Transient
private Map<String, Object> additionalProperties = new HashMap<String, Object>();

最新更新