【发布时间】:2011-06-24 14:46:49
【问题描述】:
我对一个字段有一种奇异的映射:
@ElementCollection
@CollectionTable(name = "studentGradeLevel", joinColumns = @JoinColumn(name = "studentId"))
@MapKeyJoinColumn(name = "schoolYearId")
@Column(name = "gradeLevel", nullable = false)
@ForeignKey(name = "fkStudentGrade2Student")
private Map<SchoolYear, GradeLevel> gradeLevels;
SchoolYear 是一个实体,GradeLevel 是一个枚举。
我正在使用 Hibernate 工具为架构生成 DDL。生成的架构如下:
create table studentGradeLevel (
studentId numeric(19,0) not null,
gradeLevel int not null,
schoolYearId int not null,
primary key (studentId, schoolYearId)
);
alter table studentGradeLevel
add constraint FK1BCA4A883A97C498
foreign key (schoolYearId)
references schoolYear;
alter table studentGradeLevel
add constraint fkStudentGrade2Student
foreign key (studentId)
references student;
问题是我似乎无法更改集合表和用作映射键的实体表之间的外键的约束名称。
我已经使用@ForeignKey 为@OneToMany、@ManyToMany 和其他@ElementCollections 指定约束名称,没有问题。我已经尝试过@ForiegnKey 的“inverseName”属性,但它似乎被忽略了。 @MapKeyJoinColumn 似乎没有任何会影响这一点的属性。
有谁知道有没有办法做到这一点?
【问题讨论】:
-
你的意思是'FK1BCA4A883A97C498'?为什么要管理这个名字。
-
是的。原因是如果违反了约束,返回的错误将包含一个有意义的名称。
-
有人在这里开了一张票:opensource.atlassian.com/projects/hibernate/browse/HCANN-24。您可能希望对此进行投票,以便 Hibernate 开发人员知道解决此问题的重要性。
-
我不会指望自动生成任何重要的模式。无论如何,您都必须指定表空间、检查约束、索引和各种东西。使用专用的手写脚本,里面有 cmets。
-
@Nizet 绝对是,但它是一个非常有用的起点,能够为具有数百个表的模式处理生成的脚本。
标签: java hibernate hibernate-annotations