Настраиваемая Hibernate NamingStrategy с уникальными иностранными ключами многих ко многим - PullRequest
1 голос
/ 18 сентября 2010

Я пытаюсь реализовать свою собственную Hibernate NamingStrategy на основе ImprovedNamingStrategy. Это очень хорошо ... только внешние ключи отношений многих ко многим безобразны.

Пример сценария:

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";
    }
}

это приведет к таблице teacher_courses со столбцами teacher_id, courses_id .

Я пытаюсь понять, что это таблица с именем teacher_course с полями teacher_id, course_id . Любые предложения, как суммировать мои множественные именованные свойства сущностей?

Ответы [ 2 ]

2 голосов
/ 19 сентября 2010

это приведет к таблице teacher_courses (...)

Вы уверены в этой части?AFAIK, имя по умолчанию JoinTable состоит из объединенных имен двух связанных таблиц первичных сущностей (сначала со стороны владельца), разделенных подчеркиванием (например, Teacher_Course).

(...) со столбцами teacher_id , courses_id .

Для этой части вам потребуется реализовать Алгоритм , который учитывает правописание английского языка для:

Обычное множественное число

  • фазы -> фаза
  • поцелуи> поцелуй (!)
  • блюда -> блюдо (!)
  • герои -> герой
  • территории -> территория
  • дни -> день

Почти обычное множественное число

  • Листья -> Лист
  • Ножи -> Нож

Нерегулярное множественное число

  • овца -> овца
  • дети -> ребенок (!)
  • мыши -> мышь
  • мужчины -> мужчина-женщина -> женщина

Честно говоря, это не так выглядитлегко и, вероятно, потребует какой-то словарь, если вы хотите быть правильным.

Я думаю, что лучшим вариантом будет переопределение имен по умолчанию с использованием аннотаций JoinColumn и JoinTable.

1 голос
/ 06 января 2015

Что касается столбцов внешнего ключа, вы можете переписать метод 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...