两个表,category和topic@Entity
public class Category {
private int id;
private String name;
@Id
@GeneratedValue
public int getId() {
return id;
}==========@Entity
public class Topic {
private int id;
private String title;
private Category category;

private Date createDate;

public Date getCreateDate() {
return createDate;
}
public void setCreateDate(Date createDate) {
this.createDate = createDate;
}
@ManyToOne
public Category getCategory() {
return category;
}
public void setCategory(Category category) {
this.category = category;
}

@Id
@GeneratedValue

public int getId() {
return id;
}===============之后用一个方法,放到JUnit里面测试,@Test
public void testSave() {
Session session = sf.openSession();
session.beginTransaction();

for(int i=0; i<10; i++) {
Category c = new Category();
c.setName("c" + i);

session.save(c);

System.out.println(c.getId());

}


for(int i=0; i<10; i++) {
Category c = new Category();
c.setId(1);
Topic t = new Topic();
t.setCategory(c);
t.setTitle("t" + i);
t.setCreateDate(new Date());

session.save(t);

System.out.println(t.getId());

}就是有10个category,然后第二个循环给第一个category映射10个topic。 运行后发觉报错,检查后发现,category自动生成的id是从1 到10的但是后面topic生成的id却是从11到20接下去生成的,而没有像我所想的一样也是1到10,这里就想问怎么解决这个问题? strategy里面的方法我都试过了,但是好像都没有用,topic生成的id依然是接着category生成的11到20,求解,,谢谢

解决方案 »

  1.   

    这样定义,貌似@id都共享同一个identifier生成器,所以id是会自增的,试试通过声明不同的sequence
      

  2.   

    后台使用Oracle数据库,如果没有指定id的生成器,则程序会使用一个名字为“hibernate_seq”的序列,在这个时候你的两个持久化对象使用一个序列,肯定会出现这样的问题
    解决办法:
      @SequenceGenerator(name="topic_seq", sequenceName="topic_seq",allocationSize=1)
      @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="topic_seq")