初识联合主键 

最近一直在接触联合主键,虽然数据库和model类以及hibernate映射文件都不是自己做的,但一直在用,不了解点肯定是不行的。

首先模拟个有联合主键的表

表 CLASSES(班级表)

列为

grade_Id     int   //年级号

class_id      int   //班级号

student_count  int  //学生人数

就这三个列吧,懒着写了。

其中grade_Id与class_id为该表的联合主键

主键是用来标示表中的每一条数据的,该表如果不加个其他的列(没有业务,就是单纯为了做主键而加的列)的话,只有用联合主键了。

 

下面谈下在hibernate中的配置。

首先定义model,联合主键需要定义两个(其中一个表示联合主键)

下面代码只为表达意思,一律简写。(只写表达意思的)

Class  ClaId{

        private long gradeId

        private long classId;

 

}

 

Class  Classes{

        private ClasId id;

        private long studentCount;

}

 

数据类型用long是因为long好拼……

 

 

下面看下联合主键在映射文件中的配法

(还是只配一个映射文件就好,不是说两个model就得两个映射文件.,…..)

 

 

 

 

Hibernate对于Classes这个model的映射文件中主键的配置
<composite-id name="id" class="com.hitrust.factoring.model.ClaId">
            <key-property name="classId" type="long">
                <column name="SELLER_OID" />
            </key-property>
            <key-property name="gradeId" type="long">
                <column name="UPDATE_DATETIME" />
            </key-property>
        </composite-id>

 

下面说的与本文无关,可以选读。

 

 

在我们的项目中,model的类一般不直接用,而是这样

例如表classes 对应 的model 为 BaseClasses

而项目中我们会另外写一个Classes类继承自BaseClasses,用的时候就用Classes,

而不直接用BaseClasses,在Classes类中可能会定义一些额外的字段,不是数据表里的列,是用来处理做额外的逻辑。

 

 

对于表之间的关联关系,什么多对一多对多什么的,在我们的项目里几乎没有配。原因我想可能有两个。一是业务过于复杂了,如果配关联的话肯定会乱成一团糟,再一个原因就是逻辑也不太符合(例如不是包含于被包含关系,配成多对一好像说不过去……)。肯定不能都配关联。

 

那在做查询的时候,可能会比较麻烦点,就得自己做多表连查了。说道多表联查,就不的不提,对于联合主键的表之间的联查,需要加上所有的关联条件,有时候不会只有一个关联条件。(这算是对hibernate多表联查那片博文的补充吧)

 

 

最后再加个疑问,对于那些继承了java.io.Serializable接口的类,很多时候会有个private static final long serialVersionUID = 1L;

这个serialVersionUID要怎么设置????我一般都是直接给它赋值为1L,谁知道该怎么处理的请留言,详细一点,谢谢。