首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >@EmbeddedId与@GeneratedValue在@Embeddable中

@EmbeddedId与@GeneratedValue在@Embeddable中
EN

Stack Overflow用户
提问于 2016-05-25 22:22:20
回答 1查看 7.7K关注 0票数 2

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

代码语言:javascript
复制
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);

此外,还有一个用户表,但这并不重要,有了这些,您就可以了解问题的全部情况。

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

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

问题是,在复合MENU.id_menu, butJPAdoes not support@GeneratedValuein@EmbeddedId`.的“本机”部分需要一个@GeneratedValue,例如:OPERATION.id_operation必须有@GeneratedValueOPERATION.id_menu必须从@GeneratedValue传播我解释得对吗?

我尝试使用NetBeans对来自DataBase选项的实体类的“建议”,但是为具有简单列的标识符(如MENU)的表生成@GeneratedValue注释,而不是为组合的表(如OPERATION)生成注释。

所以问题是,,我怎样才能做映射?。更改DB的结构不是一种选择,而是因为业务需求才这样做的。

如有任何帮助或指导,将不胜感激。提前谢谢你。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-26 09:23:37

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

来自Sequencing

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

因此,虽然关联表的PK可能配置为PRIMARY KEY (id_operation, id_menu),但通过自动增量,id_operation可以作为PK单独使用,因此操作可以映射如下:

代码语言:javascript
复制
@Entity
public class Operation{

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

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

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

annotation

代码语言:javascript
复制
@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;
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37448621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档