Map<String,String> 集合 table 的 ElementCollection 不是使用 Map 键作为 table 键的一部分创建的
ElementCollection of Map<String,String> collection table not created with Map key as part of table key
编辑:问题已解决,原因未知。
下面的实体映射,其中包含一个Map<String,String>
:
public class Employee {
@TableGenerator(name="Address_Gen",
table="ID_GEN",
pkColumnName="GEN_NAME",
valueColumnName="GEN_VAL",
pkColumnValue="Addr_Gen",
initialValue=10000,
allocationSize=100)
@Id @GeneratedValue(generator="Address_Gen")
private int id;
private String name;
private long salary;
@ElementCollection
@CollectionTable(name="EMP_PHONE")
@MapKeyColumn(name="PHONE_TYPE")
@Column(name="PHONE_NUM")
private Map<String, String> phoneNumbers;
}
生成一个集合 table,它有一个键(在生成的 DDL 中甚至没有被描述为主键)不包括映射键作为键的一部分:
CREATE TABLE `emp_phone` (
`Employee_ID` int(11) DEFAULT NULL,
`PHONE_NUM` varchar(255) DEFAULT NULL,
`PHONE_TYPE` varchar(255) DEFAULT NULL,
KEY `FK_EMP_PHONE_Employee_ID` (`Employee_ID`),
CONSTRAINT `FK_EMP_PHONE_Employee_ID` FOREIGN KEY (`Employee_ID`) REFERENCES `employee` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
这是错误的吗?我正在学习的书 (ProJPA2) 是这样建议的:
Unique tuples in the collection table must be the combination of the
key column and the foreign key column that references the source
entity instance...[In] the resulting collection table, along with the
source EMPLOYEE entity table that it references you can see the
primary key constraint on the EMPLOYEE_ID and PHONE_TYPE columns.
我正在使用 eclipse photon,eclipselink 2。5.x,mysql 8.0
提前致谢。
编辑
我已经使用(几乎)与以前相同的注释创建了一个新项目,但它现在正在生成预期的 DDL:
public class Employee {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
private String name;
private double salary;
@ManyToOne
private Department department;
@ElementCollection
@CollectionTable(name="EMP_PHONE")
@MapKeyColumn(name="PHONE_TYPE")
@Column(name="PHONE_NUM")
private Map<String, String> phoneNumbers = new HashMap<>();
DDL:
CREATE TABLE `emp_phone` (
`Employee_id` int(11) NOT NULL,
`PHONE_NUM` varchar(255) DEFAULT NULL,
`PHONE_TYPE` varchar(255) NOT NULL,
PRIMARY KEY (`Employee_id`,`PHONE_TYPE`),
CONSTRAINT `FKq4updxf2ebi3swv5tf3n3jp5h` FOREIGN KEY (`Employee_id`) REFERENCES `employee` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
遗憾的是,我没有时间对这两个项目进行取证检查,以确切了解是什么造成了差异。
在这种情况下,EclipseLink 似乎使用了一种更通用的映射方法,只需将映射键列添加到它将为 List 或 Set 集合类型生成的 table 中。
您可以为此提交增强请求,但这不是错误:JPA 没有具体指定生成的 table 的外观,仅指定用于字段的列。假设 DDL 生成有助于开发原型,您可以根据用例优化数据库 - 通过适当添加索引等,但并非所有数据库都以相同的方式工作。
编辑:问题已解决,原因未知。
下面的实体映射,其中包含一个Map<String,String>
:
public class Employee {
@TableGenerator(name="Address_Gen",
table="ID_GEN",
pkColumnName="GEN_NAME",
valueColumnName="GEN_VAL",
pkColumnValue="Addr_Gen",
initialValue=10000,
allocationSize=100)
@Id @GeneratedValue(generator="Address_Gen")
private int id;
private String name;
private long salary;
@ElementCollection
@CollectionTable(name="EMP_PHONE")
@MapKeyColumn(name="PHONE_TYPE")
@Column(name="PHONE_NUM")
private Map<String, String> phoneNumbers;
}
生成一个集合 table,它有一个键(在生成的 DDL 中甚至没有被描述为主键)不包括映射键作为键的一部分:
CREATE TABLE `emp_phone` (
`Employee_ID` int(11) DEFAULT NULL,
`PHONE_NUM` varchar(255) DEFAULT NULL,
`PHONE_TYPE` varchar(255) DEFAULT NULL,
KEY `FK_EMP_PHONE_Employee_ID` (`Employee_ID`),
CONSTRAINT `FK_EMP_PHONE_Employee_ID` FOREIGN KEY (`Employee_ID`) REFERENCES `employee` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
这是错误的吗?我正在学习的书 (ProJPA2) 是这样建议的:
Unique tuples in the collection table must be the combination of the key column and the foreign key column that references the source entity instance...[In] the resulting collection table, along with the source EMPLOYEE entity table that it references you can see the primary key constraint on the EMPLOYEE_ID and PHONE_TYPE columns.
我正在使用 eclipse photon,eclipselink 2。5.x,mysql 8.0
提前致谢。
编辑
我已经使用(几乎)与以前相同的注释创建了一个新项目,但它现在正在生成预期的 DDL:
public class Employee {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
private String name;
private double salary;
@ManyToOne
private Department department;
@ElementCollection
@CollectionTable(name="EMP_PHONE")
@MapKeyColumn(name="PHONE_TYPE")
@Column(name="PHONE_NUM")
private Map<String, String> phoneNumbers = new HashMap<>();
DDL:
CREATE TABLE `emp_phone` (
`Employee_id` int(11) NOT NULL,
`PHONE_NUM` varchar(255) DEFAULT NULL,
`PHONE_TYPE` varchar(255) NOT NULL,
PRIMARY KEY (`Employee_id`,`PHONE_TYPE`),
CONSTRAINT `FKq4updxf2ebi3swv5tf3n3jp5h` FOREIGN KEY (`Employee_id`) REFERENCES `employee` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
遗憾的是,我没有时间对这两个项目进行取证检查,以确切了解是什么造成了差异。
在这种情况下,EclipseLink 似乎使用了一种更通用的映射方法,只需将映射键列添加到它将为 List 或 Set 集合类型生成的 table 中。
您可以为此提交增强请求,但这不是错误:JPA 没有具体指定生成的 table 的外观,仅指定用于字段的列。假设 DDL 生成有助于开发原型,您可以根据用例优化数据库 - 通过适当添加索引等,但并非所有数据库都以相同的方式工作。