遇到这个报错,主要从2个方面考虑:一是用户的权限问题,二是程序中的表与数据库中的表是否对应,尤其是表名是否写对。
我在持久层使用的是hibernate框架连接的oracle数据库。
我让dba确认了我当前的用户确实是读写权限的,尤其对于我报错的这张表;表现出来的是对于其他的表,insert是没有任何问题的,唯独对于pri_ids_mapping这张表就是死活insert不成功。
后来找到原因:
@Entity @Table(name = "Pri_Ids_mapping") public class Pri_Ids_mapping { @Id @Column(name = "mapId", nullable = false) @SequenceGenerator(name = "seq_mapId", sequenceName = "SEQ_mapId",allocationSize= 1) @GeneratedValue(generator = "seq_mapId", strategy = GenerationType.SEQUENCE) private Long mapId;// 主键 }
这个表的主键在生成的过程中出现了问题,由于我的序列的名字没有和表名相关联,特别容易被其他表的序列给替代。
而事实上确实有一个另外的库里的表的序列和SEQ_mapId的名字重复。在创建表的时候允许我的用户使用这个序列的同义词;另外一个序列在创建的时候也允许它所在的库的用户使用这个同义词,这样,后来的将原来的覆盖;我现在想要借助序列生成ID,就要涉及到跨库了,这样就出现了访问权限不足的问题。
解决方案:
@Entity @Table(name = "Pri_Ids_mapping") public class Pri_Ids_mapping { @Id @Column(name = "mapId", nullable = false) @SequenceGenerator(name = "seq_mapId", sequenceName = "fhl_pms.SEQ_mapId",allocationSize= 1) @GeneratedValue(generator = "seq_mapId", strategy = GenerationType.SEQUENCE) private Long mapId;// 主键 }
在使用序列的时候在前面加上库名就可以了。
时间: 2024-10-11 11:56:49