我是 hibernate 的新手,正在尝试它。对于实体中的唯一字段,我为其设置 @GenerateValue 注释。假设我有两个实体,用户和公司,并且都具有带有 @GenerateValue 注释的唯一 id。当我使用 hibernate sessionfactory 保存两个实体时,生成的 id 分别为 1 和 2,其中两个实体都应该为 1。下次当我保存两者时,生成的 id 是 3 和 4 。 所以我的猜测是,@GenerateValue 在数据库级别而不是表级别工作。如何使其成为表格级别?
添加一些代码和配置。
用户实体
@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;
}
使用 hibernate session 保存
Session session = sessionFactory.getCurrentSession();
User user = new User();
session.save(user);
Company company = new Company();
session.save(company);
结果
mysql> 从用户中选择*;
+-----+
|编号 |
+-----+
| 234 | 234
+-----+
mysql> 从公司中选择*;
+-----+
|编号 |
+-----+
| 235 | 235
+-----+
根据记录,我将 hibernate-jpa-2.1-api ( 1.0.0.Draft-16 ) 与 hibernate 5 一起使用。
最佳答案
@GenerateValue
注释有一个名为 strategy
的属性,它可以包含以下策略之一来生成主键的值:
- GenerationType.AUTO
- GenerationType.IDENTITY
- GenerationType.SEQUENCE
- GenerationType.TABLE
GenerationType.AUTO
使用数据库的全局数字生成器,并且它是默认值,因此如果您仅在变量中定义 @GenerateValue
,您将得到这个行为。
我建议您使用列表中的其他选项之一来获得您期望的结果。例如,GenerationType.IDENTITY
允许您使用表中的值生成键,仅当主键是自动生成的类型时。例如,在 Postgres 中,您可以使用数据类型 SERIAL
并使用它来生成键的值。
关于java - Hibernate - 产生的值(value),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36742950/