Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.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
Hibernate 外键的列数必须与多通映射所引用的主键的列数相同_Hibernate_Jpa_Hibernate Mapping - Fatal编程技术网

Hibernate 外键的列数必须与多通映射所引用的主键的列数相同

Hibernate 外键的列数必须与多通映射所引用的主键的列数相同,hibernate,jpa,hibernate-mapping,Hibernate,Jpa,Hibernate Mapping,您好,下面是我的实体,它们之间有很多关联 student.java @Entity @Table(name = "student") public class student{ @Id @Column(name = "UserID") private String userid; @ManyToOne(cascade = CascadeType.ALL,fetch = FetchType.LAZY) @JoinColumns({ @Joi

您好,下面是我的实体,它们之间有很多关联

student.java

@Entity
@Table(name = "student")
public class student{

    @Id
    @Column(name = "UserID")
    private String userid;

    @ManyToOne(cascade = CascadeType.ALL,fetch = FetchType.LAZY)
    @JoinColumns({
       @JoinColumn(name = "userrole", referencedColumnName = "VALUE"),
       @JoinColumn(name = "userrole", referencedColumnName = "DESCRIPTION")

    })
    private studentdetails userrole;

//setters and getters 
//constructor

}
studentdetails.java

@Data
@Entity
@Table(name = "student_details")
public class studentdetails {

    @Id
    @Column(name = "VALUE")
    private String value;

    @Id
    @Column(name = "DESCRIPTION")
    private String description;

   //setters and getters 
   //constructor
}
appmain.java

public static void main()
{

//session configuration

studentdetails  sd = new studentdetails();
sd.setvalue("abc");
sd.setdescription("abcdef");

student student1 = new student();
student.setuserid("1");
student.userrole(sd);

student student2 = new student();
student.setuserid("2");
student.userrole(sd);

session.save(student1 );
session.save(student2 );


}
下面是my 2表中的列

student: 

UserID
userrole

student_details:

VALUE
DESCRIPTION
student_details中的值应输入到student表的userrole中

但是,当我执行appmain时,我得到了以下错误

org.hibernate.MappingException: Foreign key (FK6D56043A4415BDB5:student [userrole])) must have same number of columns as the referenced primary key (student_details [VALUE,DESCRIPTION])
    at org.hibernate.mapping.ForeignKey.alignColumns(ForeignKey.java:113)
    at org.hibernate.mapping.ForeignKey.alignColumns(ForeignKey.java:96)
    at org.hibernate.cfg.Configuration.secondPassCompileForeignKeys(Configuration.java:1354)
    at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1261)
    at org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:383)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1377)
    at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:954)
我试图解决这个问题,但它显示出同样的错误
请建议我如何解决此问题

要解决此问题,请按以下方式更改代码:

 @ManyToOne(cascade = CascadeType.ALL,fetch = FetchType.LAZY)
    @JoinColumns({
       @JoinColumn(name = "userrole_value", referencedColumnName = "VALUE"),
       @JoinColumn(name = "userrole_desc", referencedColumnName = "DESCRIPTION")

    })
    private studentdetails userrole;
问题原因:在映射中:

@JoinColumns({
       @JoinColumn(name = "userrole", referencedColumnName = "VALUE"),
       @JoinColumn(name = "userrole_desc", referencedColumnName = "DESCRIPTION")

    })
您正在告诉hibernate在名为userrole的学生实体表中创建一个外键,该外键引用StudentDetails实体表中名为VALUE的列

然后在下一行中,您再次告诉hibernate在StudentDetails中的列描述中使用与FKey相同的column name-userrole,因此此行将覆盖上一行

所以hibernate看到您正试图在映射到StudentDetails实体表的Student实体表中使用一列作为外键。但是StudentDetails表具有由2列组成的复合键,因此hibernate会抛出一个异常

org.hibernate.MappingException: Foreign key (FK6D56043A4415BDB5:student [userrole])) must have same number of columns as the referenced primary key (student_details [VALUE,DESCRIPTION])
其他信息:

您正试图为实体StudentDetails声明一个复合Id,因此该实体应实现可序列化接口,这是必需的。 现在,这个复合Id类应该重写equals和hashcode方法


建议您尝试遵循实体和字段的Java命名约定。

若要解决此问题,请按如下方式更改代码:

 @ManyToOne(cascade = CascadeType.ALL,fetch = FetchType.LAZY)
    @JoinColumns({
       @JoinColumn(name = "userrole_value", referencedColumnName = "VALUE"),
       @JoinColumn(name = "userrole_desc", referencedColumnName = "DESCRIPTION")

    })
    private studentdetails userrole;
问题原因:在映射中:

@JoinColumns({
       @JoinColumn(name = "userrole", referencedColumnName = "VALUE"),
       @JoinColumn(name = "userrole_desc", referencedColumnName = "DESCRIPTION")

    })
您正在告诉hibernate在名为userrole的学生实体表中创建一个外键,该外键引用StudentDetails实体表中名为VALUE的列

然后在下一行中,您再次告诉hibernate在StudentDetails中的列描述中使用与FKey相同的column name-userrole,因此此行将覆盖上一行

所以hibernate看到您正试图在映射到StudentDetails实体表的Student实体表中使用一列作为外键。但是StudentDetails表具有由2列组成的复合键,因此hibernate会抛出一个异常

org.hibernate.MappingException: Foreign key (FK6D56043A4415BDB5:student [userrole])) must have same number of columns as the referenced primary key (student_details [VALUE,DESCRIPTION])
其他信息:

您正试图为实体StudentDetails声明一个复合Id,因此该实体应实现可序列化接口,这是必需的。 现在,这个复合Id类应该重写equals和hashcode方法


建议您尝试遵循实体和字段的Java命名约定。

这是实体的完整代码吗?像@OneToMany或@ManyToOne这样的映射注释在哪里?从逻辑上讲,学生可以有单个学生详细信息映射,反之亦然,因此映射应该是@oneToOne,对吗?请查找更新后的postadded manytoone注释,我没有在postadded答案中添加它来修复您的问题,请检查。这是您实体的完整代码吗?像@OneToMany或@ManyToOne这样的映射注释在哪里?从逻辑上讲,学生可以有单个学生详细信息映射,反之亦然,因此映射应该是@oneToOne,对吗?请查找更新的postadded manytoone注释,我没有在postadded答案中添加它来解决您的问题,请检查。userrole\u value和userrole\u desc列是什么,我们的网站中没有这样的栏目table@user3824049,好的,然后更新您的问题并显示您的列的外观。您需要告诉hibernate学生表中的外键是什么。根据您的问题,您正在创建一个名为userrole的列,并告诉hibernate将其映射到student_details表的两列,这是不正确的。谢谢您的评论,请检查添加的表详细信息和我的要求。如果您有一个StudentDetails的复合键,该键包含字段值和描述,则StudentDetails表中不能只有一列与StudentDetails进行映射。这不是来自Hibernate方面的限制,而是DB限制。因此,请确保如果描述确实是StudentDetails的PrimaryKey的一部分,如果是,则列userrole只是Student表的另一列,不能将其称为FKey,您无法使用Hibernate将其映射。需要将子表中value列的值插入父表的userrole列。首先,我尝试了@JoinColumnname=userrole,referencedColumnName=VALUE,这也导致了另一个错误,因为实体类型未映射到单个属性,所以我尝试了joincolumns{}Syntax什么是userrole_VALUE和userrole_desc列,我们的table@user3824049好啊然后更新你的问题并展示你的专栏是什么样子。您需要告诉hibernate学生表中的外键是什么。根据您的问题,您正在创建一个名为userrole的列,并告诉hibernate将其映射到student_details表的两列,这两列不是co
更正。感谢您的评论,请检查添加的表详细信息和我的要求。如果您具有StudentDetails的复合键,并且具有字段值和说明,则StudentDetails表中不能只有一列与StudentDetails进行映射。这不是来自Hibernate方面的限制,而是DB限制。因此,请确保如果描述确实是StudentDetails的PrimaryKey的一部分,如果是,则列userrole只是Student表的另一列,不能将其称为FKey,您无法使用Hibernate将其映射。需要将子表中value列的值插入父表的userrole列。首先,我尝试了@JoinColumnname=userrole,referencedColumnName=VALUE,这也导致了另一个错误,因为实体类型没有映射到单个属性,所以我尝试了joincolumns{}语法