多对多中间表的不使用联合主键,自己持有Id

来源:互联网 发布:巴西人种知乎 编辑:程序博客网 时间:2024/06/03 08:48

        问题是这样的 在ORACLE数据库中存在一个多对多的的关系,即LinkManage(链接表),Organ(机构表),中间建有一个中间表LinkOrgan(链接-机构表),中间表不仅持有多方的ID为外键,并且有自己的Id属性(不是联合主键),还有自己的Status(状态)属性,CreatTime(创建时间),UpdateTime(更新时间)之类的属性。

       单纯的在多对多方建立关系,在保存时会出现ORA-01400: 无法将 NULL 插入 ("WJJK"."T_LINK_ORGAN"."ID"),即增加中间表时主键为null。

      目前解决方案有两种,一种是使用sequence(首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE权限),然后写触发器。(其他数据库完全可以直接设置为自增长)。

网友的写法是

     create sequence bign nocycle maxvalue 9999999999 start with 1;//增加数据

insert into table (ID,..) values(bign.nextval,..)
     在hibernate中的映射文件可这么写
   <id name="id" type="java.lang.Long" column="ID">
            <generator class="sequence" >
                 <param name="sequence">bign</param>
            </generator>
   </id>



  <id name="id" type="java.lang.Long" column="ID">
            <generator class="increment" >
  </id>
另外:increment 用与为long,short或者int类型生成唯一标示。只有在没有其他进程往同一张表中插入数据时才能使用。在集群下不要使用。

另一种是解决方案是在中间表的实体类里面配置两个多对一,(或者分别在LinkManage,Organ一对多)。

我比较倾向于对二种方案,可能查的时候麻烦点,但是对中间表Status字段利用时会省事很多,并且中间表自己可以持久化,不担心Id的管理问题。

0 0
原创粉丝点击