gpt4 book ai didi

java - @EmbeddedId 与@GeneratedValue 在@Embeddable 中

转载 作者:行者123 更新时间:2023-11-29 01:52:36 24 4
gpt4 key购买 nike

我有一个具有以下结构(摘录)的 MySQL 数据库:

CREATE TABLE MENU(
id_menu TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
PRIMARY KEY (id_menu)
);

CREATE TABLE OPERATION(
id_operation SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
id_menu TINYINT UNSIGNED NOT NULL,
operation VARCHAR(50) NOT NULL,
url VARCHAR(100) NOT NULL,
PRIMARY KEY (id_operation, id_menu)
);

CREATE TABLE operation_role(
id_operation SMALLINT UNSIGNED NOT NULL,
id_menu TINYINT UNSIGNED NOT NULL,
role CHAR(15) NOT NULL,
id_user BIGINT UNSIGNED NOT NULL,
PRIMARY KEY (id_operation, id_menu, role, id_user)
);

CREATE TABLE role_user(
role CHAR(15) NOT NULL
id_user BIGINT UNSIGNED NOT NULL,
PRIMARY KEY (role, id_user)
);

-- RELATIONSHIPS

--
-- TABLE: OPERATION
-- Meaning: a MENU has several OPERATION (One to Many relationship)
ALTER TABLE OPERACION ADD CONSTRAINT fk_menu_operacion
FOREIGN KEY (id_menu)
REFERENCES MENU(id_menu);

--
-- TABLE: operation_rol
-- This is the join table for the Many to Many relatioship OPERATION-role_user
ALTER TABLE operation_role ADD CONSTRAINT fk_operation_oprole
FOREIGN KEY (id_operation, id_menu)
REFERENCES OPERATION(id_operation, id_menu);

ALTER TABLE operaciones_rol ADD CONSTRAINT fk_roles_operation
FOREIGN KEY (role, id_user)
REFERENCES role_user(role, id_user);

--
-- TABLE: roles_usuario
-- Meaning: a user can have several roles (One to Many)
ALTER TABLE roles_usuario ADD CONSTRAINT fk_usuario_roles
FOREIGN KEY (id_usuario)
REFERENCES USUARIO(id_usuario);

此外,还有一个 USER 表,但它并不重要,通过这些您可以全面了解问题。

如您所见,某些列具有 AUTO_INCREMENT 属性,它将成为 @Entity 中的 @GeneratedValue(strategy = GenerationType.IDENTITY)类。

OPERATIONrole_user 具有复合主键,因为它们与其他表的关系,所以我无法更改它。由于复合 PK,映射的类必须有一个 @EmbeddedId 和相应的 @Embeddable 类。

问题是我需要在复合 PK"native" 部分中使用 @GeneratedValue,例如:OPERATION .id_operation 必须有 @GeneratedValue 并且 OPERATION.id_menu 是从 MENU.id_menu 传播的,但是JPA不支持@GeneratedValue@EmbeddedId`。我对情况的解释是否正确?

我尝试使用 NetBeans 的 “建议”Entity classes from DataBase 选项,但使用简单的方法为表生成了 @GeneratedValue 注释列的标识符(如 MENU)但不是复合标识符(如 OPERATION)。

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

感谢任何帮助或指导。非常感谢您。

最佳答案

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

来自 https://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing :

The JPA Id does not always have to match the database table primary key constraint, nor is a primary key or a unique constraint required.

因此,虽然关联表的 PK 可以配置为 PRIMARY KEY (id_operation, id_menu) 看起来,id_operation 通过自动递增,可以独立作为 PK,因此 Operation 可以映射如下:

@Entity
public class Operation{

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

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

如果您创建相关的 IDClass,则 OperationRole 可以映射如下。有关此场景的示例以及 ID 类的外观,请参见:

https://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#Example_JPA_2.0_ManyToOne_id_annotation

@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;
}

关于java - @EmbeddedId 与@GeneratedValue 在@Embeddable 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37448621/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com