当前位置: 首页 > 面试题库 >

@Embeddable中具有@GeneratedValue的@EmbeddedId

袁耀
2023-03-14
问题内容

我有一个具有以下结构的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@GeneratedValue(strategy = GenerationType.IDENTITY)@Entity类中变为的属性。

OPERATION并且role_user由于它们与其他表的关系而具有复合主键,因此我无法更改。由于为Composite
PK,因此映射的类必须具有一个@EmbeddedId带有相应@Embeddable类的。

问题是我需要@GeneratedValue在组合的 “本机”
部分中添加一个PK,例如:OPERATION.id_operation必须具有JPA @GeneratedValue @ EmbeddedId@GeneratedValueOPERATION.id_menu从中传播。我能正确解释情况吗?MENU.id_menu, butdoes not supportin`

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

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

任何帮助或指导表示赞赏。提前非常感谢您。


问题答案:

您的JPA @Id不需要匹配数据库PK列。只要它是唯一的,那么这就是所有要紧的事情,并且由于关联的列是自动递增的列,因此会是这种情况。

从https://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing:

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

因此,尽管可以按照PRIMARY KEY (id_operation, id_menu)看起来的方式配置关联表的PK,但id_operation通过自动递增,它可以单独作为PK,因此可以将操作映射如下:

@Entity
public class Operation{

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

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

如果创建相关的IDClass,则可以如下映射OperationRole。有关此方案以及ID类如何查找的示例,请参见:

https://zh.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;
}


 类似资料:
  • 问题内容: 我有班钱是@Embeddable 当我在实体中多次使用它时,一切正常。例如 上面的代码完美地工作。 现在,当我有另一个@Embeddable想要在其中包含Money实例并且该@Embeddable被实体多次使用时,就会出现问题。例: 可嵌入 public class ReportCostValues implements Serializable { 实体 public class R

  • 问题内容: 我的实体类映射如下: 我创建干净的新数据库和属性: 创建 为什么在创建数据库后,地狱(抱歉,此错误浪费了将近两天),我的postgres数据库中有一个序列? 我不想有一个序列,我只是想自动增加自动生成的值。 问题答案: 在PostgreSQL中,自动增量使用伪类型进行处理。您在执行时使用此类型。 现在要点-这种伪类型创建一个序列。使用创建的序列来处理自动增量。该列的默认值为- 。 在H

  • 我有一个使用JPA注释生成数据库主键的代码。一个数据库序列用于使用Oracle DB生成PK.Am 现在我对此的理解是:DB sequencer返回的sequence id作为rec_id。这是正确的吗? 医生说: 序列策略序列策略由两部分组成——定义命名序列和在一个或多个类的一个或多个字段中使用命名序列。@Sequence Generator注释用于定义序列并接受名称、初始值(默认值为1)和分配

  • d)已分离,但其主键不是自动生成的,并且已设置。

  • 请求表是这样注释的。 接下来,我有一个包含请求id和注释id表的联接表 现在我有了笔记表,它是普通表。它有自己的@SequenceGenerator 现在,从用户界面,用户可以改变,添加或删除备注的请求。 当我从UI添加新的Note时,我有以下代码。在这里,我已经有了请求Id,但是Notes Id必须生成并保存到Join table(request_note)表,我得到了错误。 我现在的问题或错误

  • 问题内容: 我是新来的hibernate。我不了解以下两种主要的密钥生成策略: 身分识别 序列 有人可以解释这两个是如何工作的,两者之间有什么区别? 问题答案: 引用Java持久性/标识和排序: 身份 排序使用数据库中的 特殊IDENTITY列 来允许数据库在插入对象的行时自动为其分配ID。许多数据库(例如 MySQL,DB2,SQL Server,Sybase和Postgres) 都支持标识列。