2014-11-04 41 views
0

嗨下面是我的实体,它们之间的关联多对一外键必须有相同数量为多对一映射被引用的主键列

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


} 
下面

都在我的2台

student: 

UserID 
userrole 

student_details: 

VALUE 
DESCRIPTION 

在“student_details”应该进入学生表

的“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) 

我试图解决这个问题,但它显示同样的错误 请建议我如何解决这个

+0

这是你的实体的完整代码吗?像@ @ OneToMany或@ ManyToOne这样的映射注释在哪里?从逻辑上讲,学生可以有单一的学生细节映射,反之亦然,所以映射应该是'@ oneToOne'吗? – Chaitanya 2014-11-04 06:49:52

+0

请找到更新后的帖子(添加manytoone注释),我错过了添加它在 – user3824049 2014-11-04 06:52:50

+0

后添加的答案解决您的问题,请检查。 – Chaitanya 2014-11-04 06:57:47

回答

1

要解决此问题,更改代码:

@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指的是StudentDetails实体表中名为VALUE的列。

然后在接下来的行中,您再次告诉休眠使用相同的柱面名称 - userrole作为FKey在StudentDetails中的列DESCRIPTION,所以此行覆盖了前一个。

因此,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]) 

其他信息:

您试图声明一个复合的ID为实体StudentDetails,所以这个实体应该implelemt Serializable接口,这是强制性的。 现在这个复合Id类应该覆盖equals()hashcode()方法。

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

+0

什么是userrole_value和userrole_desc列,我们的表 – user3824049 2014-11-04 07:18:11

+0

@ user3824049中没有这样的列,那么请更新您的问题并显示您的列的外观。你需要告诉hibernate Student表中的外键是什么。根据你的问题,你正在创建一个名为'userrole'的列,并且告诉hibernate将它映射到2列student_details表,这是不正确的。 – Chaitanya 2014-11-04 07:20:48

+0

感谢您的意见,请查看添加的表格细节和我的要求 – user3824049 2014-11-04 07:27:10

相关问题