自定义Hibernate NamingStrategy,带有多对多的外来密钥

时间:2010-09-18 13:31:51

标签: java hibernate orm naming-conventions

我正在尝试基于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 。 任何建议,如何推断我的多元化实体命名属性?

2 个答案:

答案 0 :(得分:2)

  

这将导致表格 teachers_courses (...)

你确定这部分吗? AFAIK,JoinTable的默认名称由两个关联的主要实体表(首先拥有一侧)的连接名称组成,由下划线分隔(例如Teacher_Course

  

(...)列 teachers_id courses_id

对于这部分,您必须实现一个 depluralizing 算法,该算法将英语拼写考虑在内:

Regular plurals

  • 阶段 - &gt;阶段
  • kisses - &gt;吻(!)
  • 菜肴 - &gt;菜(!)
  • 英雄 - &gt;英雄
  • 地区 - &gt;领土
  • 天 - &gt;天

Almost regular plurals

  • leaves - &gt;叶
  • 刀 - &gt;刀

Irregular plurals

  • 羊 - &gt;羊
  • 儿童 - &gt;孩子(!)
  • 小鼠 - &gt;小鼠
  • 男士 - &gt;男人 - 女人 - &gt;女人

老实说,这看起来并不那么容易,如果你想要正确的话,可能需要一些字典。

我认为更好的选择是使用JoinColumnJoinTable注释覆盖默认名称。

答案 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;
}