Java @在@Embedded中带有@GeneratedValue的EmbeddedId
我有一个MySQL数据库,其结构如下(摘录): 此外,还有一个用户表,但这并不重要,通过这些表,您可以了解问题的全貌 如您所见,某些列具有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
自动增量
属性,该属性将成为@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;
}