我是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.
答案 0 :(得分:2)
@ GenerateValue
注释有一个名为strategy
的属性,它可以包含以下策略之一,用于生成主键的值:
GenerationType.AUTO
对数据库使用全局数字生成器并且它是默认值,因此如果您只在变量中定义@ GenerateValue
,则会出现此行为。
我建议您使用列表中的其他一个来获取您期望的结果。例如,GenerationType.IDENTITY
允许您使用表中的值生成密钥,仅当主键生成密钥时是一种自动生成的类型。例如,在Postgres中,您可以使用数据类型SERIAL
并使用它来生成密钥的值。