首先在Oracle表中实现ID自增,其次在JPA中实现。
Oracle数据库不存在主键自增选项,现在想实现ID自增。
博客链接:oracle 实现插入自增列
打开Navicat,定位到自己创建的表。
一、 创建序列
其他-序列 填写相应的信息,特别注意:表数据为空的话,开始值从1开始。看清数据库表中的数目,只填写前三个保存自动填充后面的。
二、设置触发器
设计表-触发器
1、BEFORE
2、更新的字段
3、触发的语句 固定格式
三、测试
发现表ID字段自增
四、JPA注解
注意:以上是在数据表中设置的触发器,在数据表中执行操作语句的时候是有效的,但是在JPA中应该将触发器设置为未启用,不然就会执行两次,ID自增为2.
如果只是在数据表中设置主键自增序列、触发器,JPA中执行插入操作报错。JPA中设置主键自增序列、主键生成策略不报错,但是数据表中的触发器也执行了。
在实体类中使用 @GeneratedValue和@SequenceGenerator 完成 ID自增
@GeneratedValue和@SequenceGenerator是JPA标准注解,GeneratedValue用来定义主键生成策略,SequenceGenerator用来定义一个生成主键的序列;它们要联合使用才有效。
1、在实体类上定义生成主键的序列
2、在主键上定义主键生成的策略为序列,并引用声明好的序列。
package com.ews.jpa;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
@Table(name = "STUDENT")
@Entity
@SequenceGenerator(name = "ID_SEQ", sequenceName = "USER_SEQ", allocationSize = 1) //定义一个生成主键的序列
public class STUDENT {
@Id // 表明是该实体的id
@Column(name = "ID")
// @GeneratedValue和@SequenceGenerator是JPA标准注解,
// @GeneratedValue 定义主键生成策略
// @SequenceGenerator 定义一个生成主键的序列
// 结合起来才有效
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "ID_SEQ") //定义主键生成策略为序列,并引用声明好的序列ID_SEQ
private Integer ID;
@Column(name = "NAME")
private String NAME;
public Integer getID() {
return ID;
}
public void setID(Integer iD) {
ID = iD;
}
public String getNAME() {
return NAME;
}
public void setNAME(String nAME) {
NAME = nAME;
}
}