org.hibernate.MappingException:无法确定类型:java.util.Map
org.hibernate.MappingException: Could not determine type for: java.util.Map
我在休眠中映射 属性 时遇到问题。我只想将 Device(1 对多)映射到 DeviceData(多对 1),反之亦然。
我的输出应该是:
Table:设备=
ID,
device(一个设备编号),
Table: 设备数据 =
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
class 的所有属性,但您可以使用 @Transient
注释忽略某些属性。在你的情况下,如果你不想在两个 class 中都保留 additionalProperties
字段,你应该将它们标记为 @Transient
:
@JsonIgnore
@Transient
private Map<String, Object> additionalProperties = new HashMap<String, Object>();
我在休眠中映射 属性 时遇到问题。我只想将 Device(1 对多)映射到 DeviceData(多对 1),反之亦然。
我的输出应该是:
Table:设备= ID, device(一个设备编号),
Table: 设备数据 = 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
class 的所有属性,但您可以使用 @Transient
注释忽略某些属性。在你的情况下,如果你不想在两个 class 中都保留 additionalProperties
字段,你应该将它们标记为 @Transient
:
@JsonIgnore
@Transient
private Map<String, Object> additionalProperties = new HashMap<String, Object>();