Hibernate - 生成的值

时间:2016-04-20 11:52:48

标签: java mysql hibernate

我是hibernate的新手,正在玩它。对于实体中的唯一字段,我将@GeneratedValue注释设置为它。假设我有两个实体,user和company,并且都具有@GeneratedValue注释的唯一id。当我使用hibernate会话工厂保存两个实体时,生成的id分别为1和2,其中两个实体应该分别为1。下次我保存两者时,生成的id为3和4。 所以我的猜测是,@GeneratedValue工作在db级别而不是表级别。如何使它成为表级?

添加一些代码和配置。

用户实体

@Entity
@Table(name="user")
public class User {
    @Id
    @GeneratedValue
    @Column(name = "id")
    private Integer id;

}

公司实体

@Entity
@Table(name="company")

public class Company {
 @Id
 @GeneratedValue
 @Column(name = "id")
 private Integer id;
}

使用休眠会话保存

Session session = sessionFactory.getCurrentSession();
    User user = new User();

    session.save(user);

    Company company = new Company();
    session.save(company);

结果

的MySQL> select * from user;
+ ----- + | id | + ----- + | 234 | + ----- +

的MySQL>选择*来自公司;
+ ----- + | id | + ----- + | 235 | + ----- +

对于记录,我正在使用hibernate-jpa-2.1-api(1.0.0.Draft-16)和hibernate 5.

1 个答案:

答案 0 :(得分:2)

@ GenerateValue注释有一个名为strategy的属性,它可以包含以下策略之一,用于生成主键的值:

  • GenerationType.AUTO
  • GenerationType.IDENTITY
  • GenerationType.SEQUENCE
  • GenerationType.TABLE

GenerationType.AUTO对数据库使用全局数字生成器并且它是默认值,因此如果您只在变量中定义@ GenerateValue,则会出现此行为。

我建议您使用列表中的其他一个来获取您期望的结果。例如,GenerationType.IDENTITY允许您使用表中的值生成密钥,仅当主键生成密钥时是一种自动生成的类型。例如,在Postgres中,您可以使用数据类型SERIAL并使用它来生成密钥的值。