用EJB会话bean往oracle数据库中插入数据,为什么主键都不是从1开始呢???好奇怪,
比如,我写了一个实体Bean,里面设置id为所创建的数据库的主键,还有个列叫name,其中设置主键的生成方式如下:
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public void getid()
{...}
.......
然后用会话bean往里插数据的时候,写的业务方法,
...
public void insertinto(String name){
实体类类名 a=new 实体类类名;
a.setName(***);
em.persist(a);//em是EntityManager的对象
.....
可是这样插进Oracle中的数据,主键都不是从1开始呀!!好奇怪,都是从一个什么100多的数开始,而且我发现,好像是有一定递增规律的(就是我这个表主键值如果是101,102,103,就是有3条记录),试验建了另一个新表后,主键就从104开始了
这是怎么回事,为什么不能从1开始,我觉得应该是GenerationType.AUTO的问题,它这个AUTO是自动生成主键的意思吧。
我用的是MyEclipse6.0+jboss4.2.2GA+Oracle 10g
请高手请教!!!
比如,我写了一个实体Bean,里面设置id为所创建的数据库的主键,还有个列叫name,其中设置主键的生成方式如下:
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public void getid()
{...}
.......
然后用会话bean往里插数据的时候,写的业务方法,
...
public void insertinto(String name){
实体类类名 a=new 实体类类名;
a.setName(***);
em.persist(a);//em是EntityManager的对象
.....
可是这样插进Oracle中的数据,主键都不是从1开始呀!!好奇怪,都是从一个什么100多的数开始,而且我发现,好像是有一定递增规律的(就是我这个表主键值如果是101,102,103,就是有3条记录),试验建了另一个新表后,主键就从104开始了
这是怎么回事,为什么不能从1开始,我觉得应该是GenerationType.AUTO的问题,它这个AUTO是自动生成主键的意思吧。
我用的是MyEclipse6.0+jboss4.2.2GA+Oracle 10g
请高手请教!!!
如果是数据库的问题:
可能是:是不是生成主键时用了Sequence?
如果你取得ID的处理没有俄数据库交互,那就要看一下他的生成方法了。
你贴的代码不全啊!
没办法判断。
@Entity
@Table(name="Person")
public class Person implements Serializable{
private Integer personid;
private String name;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public Integer getPersonid(){
return personid;
}
public void setPersonid(Integer personid){
this.personid=personid;
}
@Column(name="PersonName",nullable=false,length=32)
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
}
会话Bean插入的方法如下
public void insertPerson(String name) {
Person person=new Person();
person.setName(name);
em.persist(person);
} 那么,我往数据库里插数据时,主键生成时不是从1开始的,我在想,我以前看到的资料是,如果选用AUTO,那么ejb会自动按照数据库,来决定合适的代码生成方式,如果是Oracle,那EJB会不会自动调用sequence的生成方式呀
本人对EJB3没啥了解,不搞胡说。
不过按照本人的理解,如果你不指定
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = ...
的话,默认的也应该是auto即从OpenJPA来获得ID。
至于OpenJPA的生成方法,可以参考以下的文字。
我想足以解释为什么楼主的insert开始值是103了。
(下面的是转载)
容器自动生成OpenJPA 容器默认的实体标识自动生成策略是由容器管理实体标识的自动生成,容器管理的实体标识可以支持数值型和字符型两种。当容器管理的实体标识是数字型时,OpenJPA 容器自动创建一个数据库表 OPENJPA_SEQUENCE_TABLE,用其中的 SEQUENCE_VALUE 字段来记录实体的实体标识的增长。当容器管理的实体标识是字符串类型时,OpenJPA 支持使用 uuid-string 和 uuid-hex 两种方式生成相应的实体标识。如果我们选择使用 uuid-string 方式生成实体标识时,OpenJPA 框架会自动为实体生成一个 128 位的 UUID,并且将这个 UUID 转化为使用 16 位字符表示的字符串。如果我们选择使用 uuid-hex 方式生成实体标识时,OpenJPA 框架会自动为实体生成一个 128 位的 UUID,并且将这个 UUID 转化为使用 32 位字符表示的 16 进制的字符串。数值标识 容器管理的实体标识可以是数值型的,OpenJPA 框架管理的实体标识借助于数据库的表来实现,在运行时 OpenJPA 框架会自动在数据库中创建表 OPENJPA_SEQUENCE_TABLE。它有两个字段:ID 和 SEQUENCE_VALUE ,这两个字段都是数值类型,其中 ID 是表的主键字段,它的内容是查询当前实体标识时所使用的关键词,默认值是 0。而 SEQUENCE_VALUE 记录了当前 OpenJPA 框架中当前实体标识的历史数据,内容是已经被获取实体标识的最大数值加 1。