JPA TABLR类型的ID生成策略与预期不符

公司项目可能会用到JPA,在学习主键生成策略的TABLE类型时遇到了问题,问题如下:

        <!--Maven依赖-->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>5.4.10.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-c3p0</artifactId>
            <version>5.4.21.Final</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.38</version>
        </dependency>

XML配置文件内容如下:

<!--配置持久化单元
        name:持久化单元名称
        transaction-type:事务类型
        RESOURCE_LOCAL:本地事务管理
        JTA:分布式事务管理 -->
    <persistence-unit name="myJpa" transaction-type="RESOURCE_LOCAL">
        <!--配置JPA规范的服务提供商 -->
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <!--添加持久化类-->
        <class>com.jpa.demo.Customer</class>
        <properties>
            <!-- 数据库驱动 -->
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
            <!-- 数据库地址 -->
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/test?serverTimezone=UTC" />
            <!-- 数据库用户名 -->
            <property name="javax.persistence.jdbc.user" value="root" />
            <!-- 数据库密码 -->
            <property name="javax.persistence.jdbc.password" value="yu3721140" />

            <!--配置JPA实现产品的基本属性,配置 hibernate 的基本属性 -->
            <!--控制台自动显示SQL-->
            <property name="hibernate.show_sql" value="true" />
            <!--格式化SQL-->
            <property name="hibernate.format_sql" value="true" />
            <!--生成数据表的策略-->
            <property name="hibernate.hbm2ddl.auto" value="update" />
        </properties>
    </persistence-unit>

模型类(映射)内容如下:

@Entity
@Table(name = "jpa_customer")
public class Customer {

    private Integer id;
    private String name;
    private Integer age;
    private String email;
    private Date date;

    public Customer() {
    }

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE,generator = "ID_GENERATOR")
    @TableGenerator(
            //表示该主键生成策略的名称,它被引用在@GeneratedValue中设置的generator 值中
            name = "ID_GENERATOR",
            //table 属性表示表生成策略所持久化的表名
            table = "jpa_id_generators",
            //表示在持久化表中,该主键生成策略所对应键值的名称
            pkColumnName = "PK_NAME",
            // CUSTOMER_ID 对应的 PK_VALUE存储的就是 Customer表最新的一条数据的主键
            pkColumnValue = "CUSTOMER_ID",
            //持久化表中,该主键当前所生成的值,它的值将会随着每次创建累加
            valueColumnName = "PK_VALUE"
            //表示每次主键值增加的大小,例如设置成1,则表示每次创建新记录后自动加1,默认为50
//            allocationSize = 50
    )
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    @Column(name = "name")
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Column(name = "age")
    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Column(name = "email")
    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Temporal(value = TemporalType.DATE)
    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }
}
jpa_id_generators 数据库表内容如下:

主类代码如下:

public class JpaDemoMain {
    public static void main(String[] args) {
        //创建 EntityManagerFactory
        String name = "myJpa";
        EntityManagerFactory factory = Persistence.createEntityManagerFactory(name);
        //创建 EntityManager
        EntityManager manager = factory.createEntityManager();
        //开启事务
        EntityTransaction transaction = manager.getTransaction();
        transaction.begin();
        //进行持久化操作
        Customer customer = new Customer();
        customer.setName("小明");
        customer.setAge(21);
        customer.setEmail("1122335544@qq.com");
        customer.setDate(new Date());

        manager.persist(customer);    //插入数据
        //提交事务
        transaction.commit();
        //关闭 EntityManager
        manager.close();
        //关闭 EntityManagerFactory
        factory.close();
    }
}

运行后结果截图如下:

结果和网上讲的不同,也不知道什么地方出了问题,麻烦大佬指点一下。

在 manager.persist 之后 通过 customer.getId() 方法获取下 JPA 分配的 ID,看看是多少。看你截图里的结果,像是超过整型的最大值变成了负数。

您好,我是问答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题。

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~