Hibernate基础之五:自增主键@GeneratedValue、@SequenceGenerator


一:使用默认的自增主键

主键自增有好几种策略:identity是MySql对应的自增、sequence对应oracle的自增序列,

native是根据所连接的数据库自动选择上诉两个或hilo策略


在 @Id 后边加上 @GeneratedValue,就相当于调用了native策略

(可以指定@GeneratedVlaue(strategy=GenerationType.IDENTITY)或者.SEQUENCE)

	//setter&getter
	@Id
	@Column(name="id")
	@GeneratedValue //相当于native
	public int getTeacherid() {
		return teacherid;
	}

执行时输出:DEBUG SchemaUpdate:226 - create sequence hibernate_sequence

证明Hibernate已经帮我创建了一个默认的序列


这样做有一个缺点,就是所有表都公用这一个sequence,要靠后边的方法解决



二:使用私有sequence

实体下边写
@Entity
@SequenceGenerator(name="SeqGen1",sequenceName="teacher_sequence")//name是这个序列生成器的代号,sequenceName是要存入数据库的序列的名字
............
@Id
@GeneratedValue(generator="SeqGen1")//写明使用哪个序列生成器

@Entity
@Table(name="t_Teacher")
@SequenceGenerator(name="SeqGen1",sequenceName="teacher_sequence")//name是这个序列生成器的代号,sequenceName是要存入数据库的序列的名字
public class Teacher {
	
	private int teacherid;
	private String name;
	private int age;
	private Date birthday;
	private String secret;
	private Grade grade;

	//setter&getter
	@Id
	@Column(name="id")
	@GeneratedValue(generator="SeqGen1")//写明使用哪个序列生成器
	public int getTeacherid() {
		return teacherid;
	}
这样就能每个表格都用自己指定的sequence了:
Hibernate: 
    select
        teacher_sequence.nextval 
    from
        dual



三:Table_Generator

用一张表给所有表的主键创建序列,跨数据库平台以后数据也不受影响

这个少用又复杂,用的时候再去查吧

@javax.persistence.TableGenerator(
)









你可能感兴趣的:(Hibernate基础之五:自增主键@GeneratedValue、@SequenceGenerator)