Ответ 1
Богдан, спасибо за публикацию этого. У меня была аналогичная проблема с именами таблиц с учетом регистра для Unix/Windows-переносимости с использованием Hibernate/JPA/MySQL в Linux.
Как и вы, я решил связать имена своих таблиц как все в нижнем регистре, настроив пользовательскую NamingStrategy в моем файле META-INF/persistence.xml:
<property name="hibernate.ejb.naming_strategy" value="my.package.LowerCaseNamingStrategy" />
У меня такое же исключение: org.hibernate.DuplicateMappingException: То же имя физической таблицы... С помощью отладчика у меня было прозрение, которое, возможно, , я не использовал DefaultNamingStrategy для начала! Поэтому я изменил базовый класс на org.hibernate.cfg.EJB3NamingStrategy. Я думаю, что это более удобно при использовании JPA Annotations! Вот моя окончательная NamingStrategy:
package my.package;
import org.apache.commons.lang.StringUtils;
import org.hibernate.cfg.EJB3NamingStrategy;
public class LowerCaseNamingStrategy extends EJB3NamingStrategy {
@Override
public String classToTableName(String className) {
return StringUtils.lowerCase(super.classToTableName(className));
}
@Override
public String collectionTableName(String ownerEntity, String ownerEntityTable, String associatedEntity,
String associatedEntityTable, String propertyName) {
return StringUtils.lowerCase(super.collectionTableName(ownerEntity, ownerEntityTable, associatedEntity, associatedEntityTable, propertyName));
}
@Override
public String logicalCollectionTableName(String tableName, String ownerEntityTable, String associatedEntityTable,
String propertyName) {
return StringUtils.lowerCase(super.logicalCollectionTableName(tableName, ownerEntityTable, associatedEntityTable, propertyName));
}
@Override
public String tableName(String tableName) {
return StringUtils.lowerCase(super.tableName(tableName));
}
}
PS предыдущее решение dursun не сработало для меня.