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

时间:2019-06-01 10:45:46

标签: java hibernate jpa-2.0

我在休眠状态下映射属性时遇到问题。我只想将Device(1到很多)映射到DeviceData(许多到1),反之亦然。

我的输出应该是:

表:设备= ID, 设备(设备号)

表:DeviceData = 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)

1 个答案:

答案 0 :(得分:1)

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

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