遇到這個報錯,主要從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;// 主鍵 }
在使用序列的時候在前面加上庫名就可以了。
