java - Hibernate - 产生的值(value)

标签 java mysql hibernate

我是 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/

相关文章:

java - 在 JUnit 中使用 Spring 测试服务时如何回滚数据库事务?

java - 如何在自签名Java小程序中的iText FontFactory中注册字体?

php - 如何为 while 循环的第一次迭代设置 PHP 变量?

php - mysql 查询中奇怪的额外等号。我该如何删除它?

java - 当事务只读取数据时,是否应该避免使用注解@Transactional?

java - 帮助java类型删除

java - Hibernate RevInfo 表 Rev 列达到最大范围,即 2147483647

java - 从 EJB 引用 WEbContent 文件夹中的文件(未找到文件异常)

java - 在 NetBeans 平台之外使用 Lookup API

带有 2 个 INNER JOIN 的 MYSQL 更新挂起