【问题标题】:ElementCollection of Map<String,String> collection table not created with Map key as part of table keyMap<String,String> 集合表的 ElementCollection 未使用 Map 键作为表键的一部分创建
【发布时间】:2018-09-05 16:52:49
【问题描述】:

编辑:问题已解决,原因未知。

以下实体映射,其中包含Map&lt;String,String&gt;

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 中甚至没有描述为主键)不包含映射键作为键的一部分:

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)建议:

集合表中的唯一元组必须是 键列和引用源的外键列 实体实例...[In] 生成的集合表,以及 它引用的源 EMPLOYEE 实体表,您可以看到 EMPLOYEE_ID 和 PHONE_TYPE 列的主键约束

我正在使用 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

遗憾的是,我没有时间对这两个项目进行法证检查,以了解究竟是什么造成了不同。

【问题讨论】:

    标签: mysql jpa glassfish eclipselink jpa-2.0


    【解决方案1】:

    在这种情况下,EclipseLink 似乎使用了一种更通用的映射方法,只需将映射键列添加到它将为 List 或 Set 集合类型生成的表中。

    您可以为此提出增强请求,但这不是错误:JPA 没有具体指定生成的表的外观,只指定用于字段的列。假设 DDL 生成有助于开发原型,并且您可以根据用例优化数据库 - 通过适当添加索引等,并且并非所有数据库都以相同的方式工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-23
      • 2021-09-04
      • 2021-04-29
      • 1970-01-01
      • 1970-01-01
      • 2015-06-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多