使用复合主键的@OneToMany映射无法按预期工作

时间:2019-01-28 06:14:09

标签: java hibernate one-to-many composite-primary-key

我正在尝试在应用程序中使用复合主键实现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.idMapping.mappingId.id。但是这些变量的值不匹配。在save对象上调用config方法后,Config.id的值设置为1,而Mapping.mappingId.id的设置为0,这是不正确的。有人可以告诉我这里出了什么问题吗?

谢谢。

1 个答案:

答案 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可以看到这种映射的完整示例。