【发布时间】:2016-09-23 17:39:35
【问题描述】:
我有一个具有以下结构的 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)。
OPERATION 和role_user 具有复合主键,因为它们与其他表有关系,所以我无法更改。由于复合PK,映射类必须有一个@EmbeddedId 和对应的@Embeddable 类。
问题是我需要在复合 PK 的 "native" 部分中添加一个 @GeneratedValue,例如:OPERATION.id_operation 必须有 @GeneratedValue 和 OPERATION.id_menu 传播自MENU.id_menu, butJPAdoes not support@GeneratedValuein@EmbeddedId`。我是否正确解释了情况?
我尝试使用 NetBeans 的 "suggestion" 的 Entity classes from DataBase 选项,但为具有简单列标识符的表生成 @GeneratedValue 注释(如 @987654339 @) 但不适用于组合的(如OPERATION)。
所以问题是如何进行映射?。更改数据库的结构不是一种选择,而是出于业务需求。
感谢任何帮助或指导。非常感谢您。
【问题讨论】:
标签: java mysql hibernate jpa orm