java - 具有多对多外键的自定义 Hibernate NamingStrategy

标签 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。 有什么建议,如何将我的实体的复数命名属性具体化?

最佳答案

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 (!)
  • 小鼠 -> 小鼠
  • 男人->男人-女人->女人

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

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

关于java - 具有多对多外键的自定义 Hibernate NamingStrategy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3741875/

相关文章:

hibernate - 带有 OneToOne 映射的 JPA( hibernate )问题

java - hibernate 异常 "PropertyValueException: not-null property references a > null or transient value"。我被困住了,不知道该怎么办

java - 如何正确地将对象(带有集合)绑定(bind)到Spring Forms?

hibernate - org.hibernate.QueryException : illegal attempt to dereference collection

java - 使用从 Json 响应传递的对象填充 JTable

java - Eclipse RCP 应用程序 - 如何检测应用程序何时空闲?

java - Hibernate多对多保存

node.js - 如何使默认时间戳列行为?

java - 如何同时显示谷歌地图中的所有标记标签?

java - 如何在 Akka Classic 中向 Actor 的 parent 发送消息?