Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在JPA中将Uniqueconstraint关联为外键_Java_Hibernate_Jpa - Fatal编程技术网

Java 在JPA中将Uniqueconstraint关联为外键

Java 在JPA中将Uniqueconstraint关联为外键,java,hibernate,jpa,Java,Hibernate,Jpa,这是我的场景,我试图通过使用列a1、a2、a3的@JoinColumn通过OneToMany关系将实体B与实体A关联,我得到的错误是引用的列名未映射到单个属性。后来我尝试了@Uniqueconstraint,在表A中使用a1、a2和a3列,但未能成功。你们中有谁能帮助我将实体B与as@OnToMany关系关联起来吗 A -- a1 a2 a3 PrimaryKey -- a1 and a2 B -- a1 a2 a3 b1 b2 PrimaryKey -- a1, a2, a3, and

这是我的场景,我试图通过使用列a1、a2、a3的
@JoinColumn
通过OneToMany关系将实体B与实体A关联,我得到的错误是
引用的列名未映射到单个属性
。后来我尝试了
@Uniqueconstraint
,在表A中使用a1、a2和a3列,但未能成功。你们中有谁能帮助我将实体B与as@OnToMany关系关联起来吗

A
--
a1
a2
a3

PrimaryKey -- a1 and a2

B
--
a1
a2
a3
b1
b2

PrimaryKey -- a1, a2, a3, and b1

@Entity
@Table(name = "A")
Class A
{
    @EmbeddedId
    private APK apk;

    @Column(name="a3")
    private Integer a3;

    @OneToMany(mappedBy="a")
    private Set<B> bSet;
}

@Embeddable
Class APK
{
    @Column(name="a1")
    private Integer a1;

    @Column(name="a2")
    private Integer a2;     
}

@Entity
@Table(name = "B")
Class B
{
    @EmbeddedId
    private BPK bpk;

    @Column(name="b2")
    private Integer b2;

    @ManyToOne
    @JoinColumns({
        @JoinColumn(name="a1", referencedColumnName="a1", insertable=false, updatable=false),
        @JoinColumn(name="a2", referencedColumnName="a2", insertable=false, updatable=false),
        @JoinColumn(name="a3", referencedColumnName="a3", insertable=false, updatable=false)
    })
    private A a;
}

@Embeddable
Class BPK
{
    @Column(name="a1")
    private Integer a1;

    @Column(name="a2")
    private Integer a2; 

    @Column(name="a3")
    private Integer a2;     

    @Column(name="b1")
    private Integer b1; 
}
A
--
a1
a2
a3
主键——a1和a2
B
--
a1
a2
a3
b1
b2
主键——a1、a2、a3和b1
@实体
@表(name=“A”)
甲级
{
@嵌入ID
私人APK;
@列(name=“a3”)
私有整数a3;
@OneToMany(mappedBy=“a”)
专用集bSet;
}
@可嵌入
类APK
{
@列(name=“a1”)
私有整数a1;
@列(name=“a2”)
私有整数a2;
}
@实体
@表(name=“B”)
B类
{
@嵌入ID
私营企业;
@列(name=“b2”)
私有整数b2;
@许多酮
@连接柱({
@JoinColumn(name=“a1”,referencedColumnName=“a1”,insertable=false,updateable=false),
@JoinColumn(name=“a2”,referencedColumnName=“a2”,insertable=false,updateable=false),
@JoinColumn(name=“a3”,referencedColumnName=“a3”,insertable=false,updateable=false)
})
私人A;
}
@可嵌入
BPK类
{
@列(name=“a1”)
私有整数a1;
@列(name=“a2”)
私有整数a2;
@列(name=“a3”)
私有整数a2;
@列(name=“b1”)
私有整数b1;
}

a3不是A主键的一部分,因此B表中不需要a3

有几种方法可以对此进行映射,但如果使用JPA 2.1,我会使用:

@Entity
@Table(name = "A")
Class A
{
    @EmbeddedId
    private APK apk;

    @Column(name="a3")
    private Integer a3;

    @OneToMany(mappedby='a')
    List bList;
}

@Embeddable
Class APK
{
    @Column(name="a1")
    private Integer a1;

    @Column(name="a2")
    private Integer a2;     
}


@Entity
@IdClass(BPK.class)
@Table(name = "B")
Class B
{
    @Id
    @Column(name="b1")
    private Integer b1; 

    @Column(name="b2")
    private Integer b2;

    @Id
    @ManyToOne
    @JoinColumns({
        @JoinColumn(name="a1", referencedColumnName="a1"),
        @JoinColumn(name="a2", referencedColumnName="a2")
    })
    private A a;
}

@Embeddable
Class BPK
{
    private APK a;     
    private Integer b1; 
}

不过,有很多方法可以绘制地图

a3不是A主键的一部分,因此B表中不需要a3

有几种方法可以对此进行映射,但如果使用JPA 2.1,我会使用:

@Entity
@Table(name = "A")
Class A
{
    @EmbeddedId
    private APK apk;

    @Column(name="a3")
    private Integer a3;

    @OneToMany(mappedby='a')
    List bList;
}

@Embeddable
Class APK
{
    @Column(name="a1")
    private Integer a1;

    @Column(name="a2")
    private Integer a2;     
}


@Entity
@IdClass(BPK.class)
@Table(name = "B")
Class B
{
    @Id
    @Column(name="b1")
    private Integer b1; 

    @Column(name="b2")
    private Integer b2;

    @Id
    @ManyToOne
    @JoinColumns({
        @JoinColumn(name="a1", referencedColumnName="a1"),
        @JoinColumn(name="a2", referencedColumnName="a2")
    })
    private A a;
}

@Embeddable
Class BPK
{
    private APK a;     
    private Integer b1; 
}

不过,有很多方法可以绘制地图

如果a1和a2用于唯一标识A,为什么在B中使用a1、a2和a3?您的意思是将所有3个设置为主键吗?您尝试了什么映射?Chris,a1,a2在一个表中,将作为主键。一个A实体可以有多个B实体,B使用a3和A的主键进行唯一标识。因此我需要B表中的a3。如果(a1,a2)是唯一的,则a3不能帮助唯一标识A;B将使用(a1,a2)指向单个a。您只是复制了B中已经存在于a中的一个值字段。JPA只允许对引用使用完整、唯一的主键。您可以使用引用目标pk以外的内容的外键,但它不能移植到所有JPA提供程序,并且在遍历关系时不允许有效的缓存命中。如果a1和a2用于唯一标识a,为什么在B中使用a1、a2和a3?您的意思是将所有3个设置为主键吗?您尝试了什么映射?Chris,a1,a2在一个表中,将作为主键。一个A实体可以有多个B实体,B使用a3和A的主键进行唯一标识。因此我需要B表中的a3。如果(a1,a2)是唯一的,则a3不能帮助唯一标识A;B将使用(a1,a2)指向单个a。您只是复制了B中已经存在于a中的一个值字段。JPA只允许对引用使用完整、唯一的主键。你可以使用外键引用目标pk以外的内容,但它不能移植到所有JPA提供商,并且在遍历关系时不允许高效缓存命中。Chris,用我尝试的映射更新了我的帖子。在您的代码中,我看到B表中的b1在BPK中被引用,在B类中也被引用为
@Id
?在我的场景中,通过包含a3,B表可以具有唯一性。一个A实体可以有多个B.b1只能使用Id注释引用一次。该属性在BPK中使用,我将其标记为IdClass,而不是将其用作可嵌入的。如果您想继续使用key类作为嵌入式ID,请继续-您只需要删除b2 ID映射,并使用MapsId而不是ID标记“a”映射。至于在映射中使用“a3”,我不理解。我展示的模型提供了a->B中的一对多关系和B->a中的多对多关系,而不使用a3。a3只有在使用部分键而不是唯一键时才有意义。Chris用我尝试过的映射更新了我的帖子。在您的代码中,我看到B表中的b1在BPK中被引用,在B类中也被引用为
@Id
?在我的场景中,通过包含a3,B表可以具有唯一性。一个A实体可以有多个B.b1只能使用Id注释引用一次。该属性在BPK中使用,我将其标记为IdClass,而不是将其用作可嵌入的。如果您想继续使用key类作为嵌入式ID,请继续-您只需要删除b2 ID映射,并使用MapsId而不是ID标记“a”映射。至于在映射中使用“a3”,我不理解。我展示的模型提供了a->B中的一对多关系和B->a中的多对多关系,而不使用a3。a3仅在使用部分密钥而不是唯一密钥时才相关