我在休眠状态下映射属性时遇到问题。我只想将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)
答案 0 :(得分:1)
默认情况下,JPA尝试保留@Entity
类的所有属性,但是您可以使用@Transient
注释忽略某些属性。就您而言,如果您不想在两个类中都保留additionalProperties
字段,则应将其标记为@Transient
:
@JsonIgnore
@Transient
private Map<String, Object> additionalProperties = new HashMap<String, Object>();