Спящий плюрализм - PullRequest
       14

Спящий плюрализм

3 голосов
/ 16 февраля 2010

у меня

  • База данных MySQL, используемая в настоящее время для приложения CakePHP
  • Приложение Java SE, обращающееся к той же базе данных через Hibernate, в настоящее время находится в разработке.

Я использую функцию «автоматического переноса» Netbeans для создания классов POJO и файлов XML (действительно ли мне нужны файлы XML при использовании аннотаций?). Поскольку схема довольно сложна, создание таблиц вручную - это слишком много работы.

Cake ожидает, что все таблицы БД будут множественными (класс Address автоматически сопоставляется с таблицей адресов). При выполнении автоматической миграции Netbeans выполняется множественное использование имен уже множественных имен таблиц (я получаю методы Addresses.java и setAddresseses ()).

Я знаю, что прошу проблемы с запуском двух очень разных слоев данных для одной и той же базы данных, но мне хотелось бы знать, возможно ли, чтобы Netbeans генерировал классы POJO в единственном виде или есть другой (лучше) способ справиться с этим.

1 Ответ

2 голосов
/ 17 февраля 2010

При выполнении обратного инжиниринга можно использовать пользовательскую стратегию обратного инжиниринга . Цитирование документации:

Возможно реализовать пользователя стратегия. Такая стратегия должна реализовывать org.hibernate.cfg.reveng.ReverseEngineeringStrategy. Рекомендуется использовать DelegatingReverseEngineeringStrategy и обеспечить публичный конструктор, который берет другой ReverseEngineeringStrategy как аргумент. Это позволит вам только реализовать соответствующие методы и предоставить запасную стратегию. пример пользовательской стратегии делегирования, которая преобразует все имена столбцов, которые заканчиваются с "PK" в свойство с именем "id".

public class ExampleStrategy extends DelegatingReverseEngineeringStrategy {
    public ExampleStrategy(ReverseEngineeringStrategy delegate) {
        super(delegate);
    }
    public String columnToPropertyName(TableIdentifier table, String column) {
        if(column.endsWith("PK")) {
            return "id";
        } else {
            return super.columnToPropertyName(table, column);
        }
    }
}

В вашем случае вы можете реализовать

public String tableToClassName(TableIdentifier tableIdentifier) {
    return delegate==null?null:delegate.tableToClassName(tableIdentifier);
}

для "деплюрализации" классов, сгенерированных из имен таблиц (ADDRESSES => Address).

Но, к сожалению, мастер обратного инжиниринга NetBeans Hibernate не предоставляет возможность выбора стратегии обратного инжиниринга, если у пользователя есть (это запланировано улучшение для NetBeans 7.0, если позволит время).

Так что если вы хотите использовать собственную стратегию, вам придется использовать Ant или Maven. В настоящее время это невозможно в NetBeans.

...