公司项目可能会用到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,看看是多少。看你截图里的结果,像是超过整型的最大值变成了负数。
您好,我是问答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题。
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~