映射另一个键作为外键而不是sql server中的主键

时间:2016-07-15 06:49:09

标签: java sql-server spring hibernate

我正在使用Spring mvc和hibernate,我的SQL服务器数据库中有一个查找表。这个表有4列

      @Entity
      @Table(name = "VLE_LOOKUP_DATA")

         public class Lookup_Data{

           @Id
           @GeneratedValue(strategy = GenerationType.IDENTITY)
           private long ID;

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

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

           @Column(name = "DESCRIPTION")
           private String DESCRIPTION;
       }

此表与多个表具有一对一关系,例如学生表。

    @Entity
  @Table(name = "STUDENT")

     public class student{

       @Id
       @GeneratedValue(strategy = GenerationType.IDENTITY)
       private long STUDENT_ID;

       @OneToOne
       @JoinColumn(name = "DEPARTMENT_ID")
       private Lookup_Data DEPARTMENT_ID;

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

       @OneToOne
       @JoinColumn(name = "GENDER_ID")
       private Lookup_Data GENDER_ID;
   }

此处来自Lookup Table的外键不是Lookup data的主键(ID)。列名 CODE 在其他表中被引用为外键。这就是为什么当我运行时在这个例子中,OneToOne关系给出了错误

   java.sql.SQLException: Conversion failed when converting the varchar to data type int.

因为代码是字符串值。

有没有办法在 Spring Mvc启动应用程序中实现这种情况?

注意: sql server 中,此查询可以完成所需的工作。

  SELECT * FROM STUDENT as e  left join VLE_LOOKUP_DATA as di on e.DEPARTMENT_ID=di.CODE

1 个答案:

答案 0 :(得分:0)

JPA旨在支持广泛的DBMS(数据库服务器),因此它只支持SQL标准规范。

在您当前的情况下,SQL规范不支持2个字段之间的比较等于(仅可能由sql server支持),因此JPA会引发此错误。所以我认为不是使用关系映射来获取Lookup_data,而是可以执行普通的JPQL或本机查询。