elementcollection-of-map< string,string>集合表不是用map键作为表键的一部分创建的

cbwuti44  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(400)

edit:issue resolved,原因未知。
以下实体Map包含 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;   
}

生成一个集合表,该表中有一个键(在生成的ddl中甚至没有被描述为主键),但该键不包括Map键作为键的一部分:

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)是这样建议的:
集合表中的唯一元组必须是键列和外键列的组合,外键列引用了结果集合表中的源实体示例…[在]以及它引用的源雇员实体表您可以看到雇员id和电话类型列上的主键约束。
我使用的是eclipse photon,eclipselink2.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

可悲的是,我没有时间对这两个项目进行取证,看看到底是什么造成了不同。

vsnjm48y

vsnjm48y1#

在本例中,eclipselink似乎使用了一种更通用的Map方法,只需将Map键列添加到它将为列表或集合类型生成的表中。
您可以为此提交一个增强请求,但这不是一个bug:jpa没有指定生成的表的确切外观,只指定用于字段的列。假设ddl生成有助于开发原型,您可以根据您的用例优化您的数据库—通过适当地添加索引等,而且并非所有数据库的工作方式都是相同的。

相关问题