我正在尝试在应用程序中使用复合主键实现OneToMany
映射。该应用程序涉及的实体如下:
// Config data
@Data
@Entity
public class Config {
@Id
@GeneratedValue
private int id;
@OneToMany(mappedBy = "config", fetch = FetchType.EAGER, cascade = { CascadeType.ALL })
private Set<Mapping> mappings;
}
带有复合键的类为:
@Data
@Entity
public class Mapping {
@EmbeddedId
private MappingId mappingId;
@ElementCollection
private List<Integer> values;
@ManyToOne
@JoinColumn(name = "id", nullable = false, insertable = false, updatable = false)
private Config config;
}
组合键:
@Data
@Embeddable
public class MappingId implements Serializable {
private int id;
private String comment;
}
现在,我正在尝试保存以下Config
json数据:
{
"mappings": [
{
"mappingId": {
"comment": "comment#1"
},
"values": [
123,
456
]
}
]
}
该代码应该为id
列自动生成一个值,并将其分配给Config.id
和Mapping.mappingId.id
。但是这些变量的值不匹配。在save
对象上调用config
方法后,Config.id
的值设置为1
,而Mapping.mappingId.id
的设置为0
,这是不正确的。有人可以告诉我这里出了什么问题吗?
谢谢。
答案 0 :(得分:0)
您在@MapsId
属性上缺少Config config
注释。
@MapsId
注释告诉Hibernate,应将关联实体的主键用作主键或用作组合主键的一部分。如果将其与复合主键一起使用,则需要引用关联实体的主键值应映射到的属性。
此映射应将Config.id
的值设置为Mapping.mappingId.id
:
@Data
@Entity
public class Mapping {
@EmbeddedId
private MappingId mappingId;
@ElementCollection
private List<Integer> values;
@ManyToOne
@JoinColumn(name = "id", nullable = false, insertable = false, updatable = false)
@MapsId("id")
private Config config;
}
然后here可以看到这种映射的完整示例。