我正在尝试基于 ImprovedNamingStrategy 实现我自己的 Hibernate NamingStrategy。这很好……只是多对多关系的外键很丑。
示例场景:
public class Teacher {
@ManyToMany
private Set<Course> courses;
}
public class Course {
@ManyToMany
private Set<Teacher> teachers;
}
使用我的自定义命名策略
public class MyImprovedNamingStrategy extends ImprovedNamingStrategy {
private static final long serialVersionUID = 1L;
@Override
public String foreignKeyColumnName(String propertyName, String propertyEntityName, String propertyTableName, String referencedColumnName) {
String s = super.foreignKeyColumnName(propertyName, propertyEntityName, propertyTableName, referencedColumnName);
return s.endsWith("_id") ? s : s + "_id";
}
}
这将生成一个表 teachers_courses,其中包含 teachers_id、courses_id 列。
我试图实现的是一个名为 teacher_course 的表,其中包含字段 teacher_id、course_id。 有什么建议,如何将我的实体的复数命名属性具体化?
最佳答案
this would lead to a table teachers_courses (...)
你确定这部分吗?据我所知,JoinTable
的默认名称由 两个关联的主要实体表(首先是拥有方)的串联名称组成,用下划线分隔(例如 Teacher_Course
).
(...) with the columns teachers_id, courses_id.
对于这一部分,您必须实现一个去复数化算法,该算法将英语拼写考虑在内:
Regular plurals
- 阶段 -> 阶段
- 亲吻 -> 亲吻 (!)
- 菜肴 -> 菜肴 (!)
- 英雄 -> 英雄
- 领土 -> 领土
- 天 -> 天
Almost regular plurals
- 叶子 -> 叶子
- 刀 -> 刀
Irregular plurals
- 绵羊 -> 绵羊
- child -> child (!)
- 小鼠 -> 小鼠
- 男人->男人-女人->女人
老实说,这看起来并不容易,如果你想正确的话,可能需要某种字典。
我认为更好的选择是使用 JoinColumn
和 JoinTable
注释覆盖默认名称。
关于java - 具有多对多外键的自定义 Hibernate NamingStrategy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3741875/