Java 具有嵌入实体的Hibernate可传递复合外键依赖

Java 具有嵌入实体的Hibernate可传递复合外键依赖,java,hibernate,Java,Hibernate,我想将一个现有的数据库(暂时不能更改)映射到Hibernate实体。 但我的映射似乎有一个我无法克服的可传递映射复合键的问题 FluidSampleLabel将FluidSample作为外键和它自己的复合主键的一部分。Hibernate似乎忽略了FluidSampleLabel中嵌入外键实体FluidSample映射的列/嵌入id Github上的测试项目: 如果嵌入式FK上没有@ManyToOne带注释的命名列,则会出现以下错误: Caused by: org.hibernate.Mappi

我想将一个现有的数据库(暂时不能更改)映射到Hibernate实体。 但我的映射似乎有一个我无法克服的可传递映射复合键的问题

FluidSampleLabel将FluidSample作为外键和它自己的复合主键的一部分。Hibernate似乎忽略了FluidSampleLabel中嵌入外键实体FluidSample映射的列/嵌入id

Github上的测试项目:

如果嵌入式FK上没有
@ManyToOne
带注释的命名列,则会出现以下错误:

Caused by: org.hibernate.MappingException: Foreign key (FK246FD874D0837E3B:fluid_sample_label [sample])) must have same number of columns as the referenced primary key (fluid_sample [sampleGroup,pre_post])
创建序列样本\u组\u序列开始10000;
创建表格示例组(
示例组id int主键,
有效载荷varchar(200)
);
创建表格流体样本(
样本组id int不为空,
pre_post varchar(20)非空检查(pre_post in('pre','post')),
金额编号(20,10)不为空,
主键(样本组id、前/后),
约束fk\ U流体\样本\组外键(样本\组\ id)引用样本\组(样本\组\ id)
);
创建表格流体样本标签(
样本组id int,
pre_post varchar(20)非空检查(pre_post in('pre','post')),
标签varchar(200)不为空,
主键(样本组id、前/后、标签),
约束fk\ U流体\标签\流体外键(样本\组\ id,前置\后置)引用流体\样本(样本\组\ id,前置\后置)
);
@实体
@SequenceGenerator(name=“sampleGroupSequence”,sequenceName=“sample\u group\u seq”,allocationSize=1)
@表(name=“样本组”)
公共类抽样组
{
@身份证
@GeneratedValue(generator=“sampleGroupSequence”,strategy=GenerationType.SEQUENCE)
@列(name=“sample\u group\u id”)
私有整数sampleGroupId;
@OneToMany(mappedBy=“sampleGroup”)
私有列表fluidSamples=new ArrayList();
@列(name=“有效负载”)
专用字符串有效载荷;
公共样本组()
{
}
公共流体样本addNewPreFluidSample()
{
FluidSample sample=新的FluidSample(此,PrePost.PRE);
this.fluidSamples.add(示例);
返回样品;
}
}
@实体
@表(name=“流体样本”)
公共类FluidSample
{
@身份证
@许多酮
@JoinColumn(name=“样本组id”)
私有样本组样本组;
@身份证
@列(name=“pre_post”)
@枚举(EnumType.STRING)
私人介词;
@OneToMany(mappedBy=“示例”)
私有列表标签=新的ArrayList();
@列(name=“amount”)
私人金额;
@抑制警告(“未使用”)
私有FluidSample()
{
}
公共流体样本(样本组样本组、前置前置前置)
{
this.sampleGroup=sampleGroup;
this.prePost=prePost;
}
public FluidSampleLabel addNewLabel(字符串值)
{
FluidSampleLabel=新的FluidSampleLabel(此值);
this.labels.add(标签);
退货标签;
}
}
@实体
@表(name=“流体样品标签”)
公共类FluidSampleLabel
{
@身份证
@许多酮
@JoinColumns({@JoinColumn(name=“sample\u group\u id”),@JoinColumn(name=“pre\u post”)})
私人流动样本;
@身份证
私有字符串值;
@抑制警告(“未使用”)
私有FluidSampleLabel()
{
}
FluidSampleLabel(FluidSample样本,字符串值)
{
这个样本=样本;
这个值=值;
}
公共字符串getValue()
{
返回此.value;
}
}
公共枚举前置
{
职前、职后;
}
Caused by: org.hibernate.MappingException: Foreign key (FK246FD874D0837E3B:fluid_sample_label [sample])) must have same number of columns as the referenced primary key (fluid_sample [sampleGroup,pre_post])
@Entity
@SequenceGenerator(name = "sampleGroupSequence", sequenceName = "sample_group_seq", allocationSize = 1)
@Table(name = "sample_group")
public class SampleGroup
{
    @Id
    @GeneratedValue(generator = "sampleGroupSequence", strategy = GenerationType.SEQUENCE)
    @Column(name = "sample_group_id")
    private Integer sampleGroupId;

    @OneToMany(mappedBy = "sampleGroup")
    private List<FluidSample> fluidSamples = new ArrayList<>();

    @Column(name = "payload")
    private String payload;

    public SampleGroup()
    {
    }

    public FluidSample addNewPreFluidSample()
    {
        FluidSample sample = new FluidSample(this, PrePost.PRE);
        this.fluidSamples.add(sample);
        return sample;
    }
}


@Entity
@Table(name = "fluid_sample")
public class FluidSample
{
    @Id
            @ManyToOne
            @JoinColumn(name = "sample_group_id")
    private SampleGroup sampleGroup;

    @Id
    @Column(name = "pre_post")
    @Enumerated(EnumType.STRING)
    private PrePost prePost;

    @OneToMany(mappedBy = "sample")
    private List<FluidSampleLabel> labels = new ArrayList<>();

    @Column(name = "amount")
    private BigDecimal amount;

    @SuppressWarnings("unused")
    private FluidSample()
    {
    }

    public FluidSample(SampleGroup sampleGroup, PrePost prePost)
    {
        this.sampleGroup = sampleGroup;
        this.prePost = prePost;
    }

    public FluidSampleLabel addNewLabel(String value)
    {
        FluidSampleLabel label = new FluidSampleLabel(this, value);
        this.labels.add(label);
        return label;
    }
}

@Entity
@Table(name = "fluid_sample_label")
public class FluidSampleLabel
{
    @Id
            @ManyToOne
            @JoinColumns({ @JoinColumn(name = "sample_group_id"), @JoinColumn(name = "pre_post")})
    private FluidSample sample;

    @Id
    private String value;

    @SuppressWarnings("unused")
    private FluidSampleLabel()
    {
    }

    FluidSampleLabel(FluidSample sample, String value)
    {
        this.sample = sample;
        this.value = value;
    }

    public String getValue()
    {
        return this.value;
    }
}



public enum PrePost
{
    PRE, POST;
}