Java @在@Embedded中带有@GeneratedValue的EmbeddedId

Java @在@Embedded中带有@GeneratedValue的EmbeddedId,java,mysql,hibernate,jpa,orm,Java,Mysql,Hibernate,Jpa,Orm,我有一个MySQL数据库,其结构如下(摘录): 此外,还有一个用户表,但这并不重要,通过这些表,您可以了解问题的全貌 如您所见,某些列具有自动增量属性,该属性将成为@GeneratedValue(strategy=GenerationType.IDENTITY)中的@Entity类 OPERATION和role\u user具有复合主键,因为它们与其他表有关系,所以我无法更改。由于组合的PK,映射的类必须有一个@EmbeddedId,并带有相应的@embedded类 问题是我需要一个@Gener

我有一个MySQL数据库,其结构如下(摘录):

此外,还有一个用户表,但这并不重要,通过这些表,您可以了解问题的全貌

如您所见,某些列具有
自动增量
属性,该属性将成为
@GeneratedValue(strategy=GenerationType.IDENTITY)
中的
@Entity

OPERATION
role\u user
具有复合主键,因为它们与其他表有关系,所以我无法更改。由于组合的
PK
,映射的类必须有一个
@EmbeddedId
,并带有相应的
@embedded

问题是我需要一个
@GeneratedValue
在复合
PK
的“本机”部分,例如:
操作。id\u操作必须具有
@GeneratedValue
操作。id\u菜单
菜单.id\u菜单传播,但是
JPA
不支持
@EmbeddedId`中的
@GeneratedValue
。我对情况的解释正确吗

我尝试使用NetBeans的“建议”数据库中的实体类选项,但为具有简单列标识符的表生成
@GeneratedValue
注释(如
菜单
),而不是为组合的表生成注释(如
操作

所以问题是如何进行映射?。更改数据库的结构不是一个选项,而是因为业务需求而这样做的


感谢您的帮助或指导。非常感谢您。

您的JPA
@Id
不需要与数据库PK列匹配。只要它是唯一的,那么这就是最重要的,并且关联的列是一个自动递增的列,那么情况就是这样

发件人:

JPA Id并不总是必须与数据库主表匹配 键约束,也不需要主键或唯一约束

因此,虽然关联表的主键可以配置为
主键(id\u操作,id\u菜单)
,但通过自动递增,
id\u操作
,可以独立为主键,因此操作可以映射如下:

@Entity
public class Operation{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne
    @JoinColumn(name = "id_menu")
    private Menu menu;
}
如果创建相关的IDClass,则OperationRole可以映射如下。有关此场景的示例以及ID类将如何查看:


好吧,那会让我安心的,谢谢。现在,如何将
MENU.id\u MENU
的传播从
菜单
表映射到
操作
,然后映射到
操作角色
?有了这一点,我将非常高兴能够胜任这个角色。不确定操作还需要什么。只需设置相关菜单。好的,我会尝试一下,让你知道它是如何运行的。谢谢你的时间
@Entity
public class Operation{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne
    @JoinColumn(name = "id_menu")
    private Menu menu;
}
@Entity
@IdClass(OperationRolePk.class)
public class OperationRole{

        @Id
        @ManyToOne
        @JoinColumn(name = "id_operation")
        private Operation operation;

        @Id
        @ManyToOne
        @JoinColumn(name = "id_menu")
        private Menu menu;

        @Id
        @ManyToOne
        @JoinColumn(name = "id_user")
        private User user;
}