外键必须具有与多对一映射所引用的主键相同的列数

2023-12-10

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

学生.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

}

学生详细信息.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
}

应用程序主程序

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 );


}

下面是我的 2 个表中的列

student: 

UserID
userrole

student_details:

VALUE
DESCRIPTION

“student_details”中的“value”应输入学生表的“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创建一个外键Student实体表称为userrole指的是名为VALUE in StudentDetails实体表。

然后在下一行中,您再次告诉 hibernate 使用相同的列名 -userrole作为列的 FKeyDESCRIPTION in StudentDetails,因此这一行会覆盖前一行。

因此,hibernate 发现您正在尝试将单个列作为外键Student映射到的实体表StudentDetails实体表。但是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])

附加信息:

您正在尝试为实体声明一个复合 IDStudentDetails,所以这个实体应该实现Serializable接口,这是强制性的。 现在这个复合 Id 类应该重写equals() and hashcode()方法。

只是一个建议,请尝试遵循实体和字段的 Java 命名约定。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

外键必须具有与多对一映射所引用的主键相同的列数 的相关文章

随机推荐