Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JPA嵌入式复合主键及ID自动生成_Jpa_Primary Key_Auto Increment_Composite Primary Key - Fatal编程技术网

JPA嵌入式复合主键及ID自动生成

JPA嵌入式复合主键及ID自动生成,jpa,primary-key,auto-increment,composite-primary-key,Jpa,Primary Key,Auto Increment,Composite Primary Key,我有很多表都有这样的总体布局。请注意,这里的SQL并不完整——这是说明问题的最低要求:- table1 ------ int ID auto_increment, table2_ID int, -- Foreign key table3_ID int, -- Foreign key prop1 varchar, prop2 int; 表1与表2有多对一的识别关系,表2与表3有多对一的识别关系,等等 NetBeans为所有表创建与此类似的实体类内容:- table1.java ---------

我有很多表都有这样的总体布局。请注意,这里的SQL并不完整——这是说明问题的最低要求:-

table1
------
int ID auto_increment,
table2_ID int, -- Foreign key
table3_ID int, -- Foreign key
prop1 varchar,
prop2 int;
表1与表2有多对一的识别关系,表2与表3有多对一的识别关系,等等

NetBeans为所有表创建与此类似的实体类内容:-

table1.java
-----------
@EmbeddedId
table1PK key;
@Column(name = "prop1")
String prop1;
@Column(name = "prop2")
int prop2;

table1PK.java
-------------
@Column(name = "ID")
int ID;
@Column(name = "table2_ID")
int table2ID;
@Column(name = "table3_ID")
int table3ID;
如表定义中所示,我希望自动生成每个表的唯一ID,并希望使用@TableGenerator来完成此操作

如果我在PK类中执行以下操作,a是否有效,b是否安全

table1PK.java
-------------
@TableGenerator(name="table1ID", table="id_generator", pkColumnName="gen_name", valueColumnName="gen_value", initialValue = 1, allocationSize = 1 )
@GeneratedValue(strategy=GenerationType.TABLE, generator = "table1ID" )
@Column(name = "ID")
int ID;
@Column(name = "table2_ID")
int table2ID;
@Column(name = "table3_ID")
int table3ID;
我已经将表生成器代码添加到其中一个PK类中,并且项目构建和部署没有错误,但是NetBeans在PK表中对ID发出警告:-

GeneratedValue annotation should only be used for Id field

虽然该字段是复合主键的一部分,但它是基础表上的一个ID字段。

如果该ID是唯一且不可变的,则它应该是您的主键。添加额外属性使其成为复合PK只会让事情变得更加困难。避免像瘟疫一样使用复合键。谢谢你的评论,尽管我不同意你的观点。复合键中的“附加属性”是来自相关表的唯一ID,它们对数据实施关系约束。从复合主键中删除这些外键将破坏数据库的关系设计,并破坏数据完整性。复合键是关系数据库设计的一个核心特性,不应该仅仅因为开发人员可能需要一些额外的工作就删除它们。它们执行什么?数据库将检查元组[ID,FK1 FK2]是否唯一。无论FK1和FK2的值是什么,这都是正确的,因为ID已经是唯一的。通过在PK?身份中添加它们,您可以获得什么额外的完整性。如果将它们从主键中删除,则关系不再是标识关系。这些都与我提出的问题无关,即我如何做,而不是我应该做。