java - 带一个自增的Spring JPA复合PK

标签 java hibernate spring-boot jpa spring-boot-jpa

我正在尝试使用 Spring Boot 2.1.2.RELEASE + JPA(使用启动器)和 MySQL (InnoDB) 来保留具有复合主键的实体,其中一个应该自动递增。我有一个带有 2 个非抽象子类的抽象类,我正在使用单表策略进行继承。

我一直在寻找如何实现这一目标,但每一篇似乎都在寻找与我相同的帖子最终都没有答案 (example)。

我当前的设置如下所示(为清楚起见省略了 setter、getter 和构造函数)。

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@IdClass(MyEntityPK.class)
public abstract class MyEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    long pk1; //Should be auto-incremented

    @Id
    OffsetDateTime pk2;

    //More fields...
public class MyEntityPK implements Serializable {
   private static final long serialVersionUID = 1L;

   long pk1;
   OffsetDateTime pk2;
}
@Repository
public interface MyEntityRepository extends CrudRepository<MyEntity, MyEntityPK> {
   //Some methods like save().
}


我发现的第一个问题是表格生成。如果声明如下,MySQL 允许创建 PK

PRIMARY KEY (pk1, pk2)

但顺序不一样

PRIMARY KEY (pk2, pk1)

创建表时,Hibernate 使用第二个,因此失败。还尝试更改字段顺序但无济于事。我认为这可能是 Hibernate 的问题,但我不确定。任何人都可以确认吗?不管怎样,我通过手动创建 DDL 脚本并通过 Hibernate 禁用自动 DDL 解决了这个问题。

下一个问题,我没有找到答案,是实体在表中正确保存,但是存储库的保存方法返回的id始终为0。我在保存之前手动设置了pk2,同时将 pk1 留给 DB 完成。

entity.setPk2(OffsetDateTime.now());
Entity savedEntity = repository.save(entity); //savedEntity has id 1 in table but 0 in code

调试时,我得到了这个 isNew() method .事实证明它返回 false,因为 MyEntityPK 与 null 不同(我设置了 pk2)。这当然不是我所期望的,因为我实际上是在保存一个新实体,因为我的 PK 是复合的并且我将一个字段留空。所以,我也认为这可能是一个错误。有一些类重写了 isNew() 方法,但它们似乎没有被使用。

我做错了什么还是这是一个错误?帮助赞赏:)

最佳答案

不支持@EmbededId 或@IdClass 上的@GeneratedValue(strategy = GenerationType.IDENTITY)。

这是一个与您的请求完全相关的错误,该错误被 hibernate 拒绝 https://hibernate.atlassian.net/browse/ANN-268

这是另一个更近期的错误报告。请注意 Vlad Mihalcea 评论:

This is not a Blocker, it's merely a Major issue. For instance, the JPA spec does not even say if generated identifiers are allowed in a Composite Identifier.

Anyway, this only works as @IdClass with sequence-based identifiers, as explained in this article.

https://hibernate.atlassian.net/browse/HHH-9662

引文中的文章解释了如何在复合上映射@GeneratedValue(strategy = GenerationType.SEQUENCE)。

关于java - 带一个自增的Spring JPA复合PK,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56318664/

相关文章:

java - 配置服务器无法配置数据源 : 'url' attribute is not specified and no embedded datasource could be configured

java - 如何在json比较中跳过一个节点

java - 无法生成 Cloud Endpoint 客户端库 - "Not an App Engine project"

Hibernate LEFT OUTER JOIN 与 DetachedCriteria

hibernate - 第一个 hibernate 程序出错

java - 如何使 Async 注解在 Spring Boot 中工作?

java - 从异常重定向回来后如何将数据保留在表单中

java - Hibernate Java - 无法反序列化/无效流头错误

java - Spring 3.0 MVC 异常处理程序

java - 映射同类关系