我正在尝试基于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 。 任何建议,如何推断我的多元化实体命名属性?
答案 0 :(得分:2)
这将导致表格 teachers_courses (...)
你确定这部分吗? AFAIK,JoinTable
的默认名称由两个关联的主要实体表(首先拥有一侧)的连接名称组成,由下划线分隔(例如Teacher_Course
)
(...)列 teachers_id , courses_id 。
对于这部分,您必须实现一个 depluralizing 算法,该算法将英语拼写考虑在内:
老实说,这看起来并不那么容易,如果你想要正确的话,可能需要一些字典。
我认为更好的选择是使用JoinColumn
和JoinTable
注释覆盖默认名称。
答案 1 :(得分:1)
对于外键列,您可以重写foreignKeyColumnName()
方法以使用propertyTableName
而不是propertyName
。
按照ImprovedNamingStrategy
中的示例,您可能会想出类似的内容:
@Override
public String foreignKeyColumnName(String propertyName, String propertyEntityName, String propertyTableName, String referencedColumnName) {
String header = propertyTableName != null ? propertyTableName : propertyName;
if (header == null) {
throw new AssertionFailure("NamingStrategy not properly filled");
}
return columnName(header) + "_" + referencedColumnName;
}