我有一个具有以下结构的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@GeneratedValue
并
OPERATION.id_menu从中传播。我能正确解释情况吗?
MENU.id_menu, butdoes not support
in`
我尝试使用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) 都支持标识列。