Java Spring JPA复合PK,一个自动递增

Java Spring JPA复合PK,一个自动递增,java,hibernate,spring-boot,jpa,spring-boot-jpa,Java,Hibernate,Spring Boot,Jpa,Spring Boot Jpa,我正在尝试使用SpringBoot2.1.2.RELEASE+JPA(使用启动器)和MySQL(InnoDB)来持久化一个具有复合主键的实体,其中一个主键应该是自动递增的。我有一个包含2个非抽象子类的抽象类,我使用单表策略进行继承 我一直在寻找如何去实现这一点,但每一个帖子似乎都在寻找与我相同的答案() 我当前的设置是这样的(为了清晰起见,省略了setter、getter和构造函数) 公共类MyEntityPK实现可序列化{ 私有静态最终长serialVersionUID=1L; 长pk1; O

我正在尝试使用SpringBoot2.1.2.RELEASE+JPA(使用启动器)和MySQL(InnoDB)来持久化一个具有复合主键的实体,其中一个主键应该是自动递增的。我有一个包含2个非抽象子类的抽象类,我使用单表策略进行继承

我一直在寻找如何去实现这一点,但每一个帖子似乎都在寻找与我相同的答案()

我当前的设置是这样的(为了清晰起见,省略了setter、getter和构造函数)

公共类MyEntityPK实现可序列化{
私有静态最终长serialVersionUID=1L;
长pk1;
OffsetDateTime pk2;
}
@存储库
公共接口MyEntityRepository扩展了Crudepository{
//有些方法,如save()。
}
我发现的第一个问题是表的生成。MySQL允许创建PK,如果它声明为

PRIMARY KEY (pk1, pk2)
但顺序不同

PRIMARY KEY (pk2, pk1)
创建表时,Hibernate使用第二个表,因此失败。还试图更改字段顺序,但无效。我想这可能是Hibernate的问题,但我不确定。有人能证实吗?无论如何,我通过手动创建DDL脚本并通过Hibernate禁用自动DDL解决了这个问题

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

entity.setPk2(OffsetDateTime.now());
Entity savedEntity = repository.save(entity); //savedEntity has id 1 in table but 0 in code
在调试时,我得出了这个结论。结果它返回了false,因为MyEntityPK不同于null(我设置了pk2)。这当然不是我所期望的,因为我实际上正在保存一个新实体,因为我的PK是复合的,我留下了一个字段为空。所以,我也认为这可能是一个错误。有些类重写了isNew()方法,但它们似乎没有被使用

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

不支持@EmbeddedId或@IdClass上的@GeneratedValue(策略=GenerationType.IDENTITY)

下面是一个与您的请求完全相关的bug,它被hibernate拒绝

下面是另一个最近发布的bug报告。请注意此处的Vlad Mihalcea评论:

这不是一个拦截器,它只是一个主要问题例如 JPA规范甚至没有说明是否允许在 复合标识符。

无论如何,这只适用于带有基于序列标识符的@IdClass, 正如本文所解释的


引文中的文章解释了如何将@GeneratedValue(strategy=GenerationType.SEQUENCE)映射到composite上。

感谢您的快速响应。正如文章所描述的,它似乎是受支持的,只是不支持身份策略:(确实是一个主要问题。无论如何,我将此标记为可接受的答案。我们最终使用了一个非复合PK。@Fernebalboa我将在答案中反映出来以供完成。
entity.setPk2(OffsetDateTime.now());
Entity savedEntity = repository.save(entity); //savedEntity has id 1 in table but 0 in code