Что означает ошибка "org.hibernate.DuplicateMappingException"? - PullRequest
13 голосов
/ 31 января 2011

Я пытаюсь заставить JPA / Hibernate генерировать и использовать только строчные имена таблиц.Я реализовал NamingStrategy следующим образом:

public class MyNamingStrategy extends DefaultNamingStrategy {

  @Override
  public String classToTableName(String className) {
    return super.classToTableName(className).toLowerCase();
  }
}

Я применил его, установив это свойство в persistence.xml:

<property name="hibernate.ejb.naming_strategy" value="entities.strategy.MyNamingStrategy"/>

Когда я это делаю, я получаю следующую трассировку стека:

SEVERE: Exception while invoking class org.glassfish.persistence.jpa.JPADeployer prepare method
org.hibernate.DuplicateMappingException: Same physical table name [planning] references several logical table names: [Planning], [OrderProductMan_Planning]
        at org.hibernate.cfg.Configuration$MappingsImpl.addTableBinding(Configuration.java:2629)
        at org.hibernate.cfg.annotations.TableBinder.buildAndFillTable(TableBinder.java:254)
        at org.hibernate.cfg.annotations.TableBinder.bind(TableBinder.java:177)

Что означает

То же имя физической таблицы [Planning] ссылается на несколько логических имен таблиц: [Planning], [OrderProductMan_Planning]

?

Сущности из-за ошибки упрощены настолько, насколько я мог.Дайте мне знать, если вам нужен отдых.

@Entity
public class Planning implements Serializable {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private Integer id;

  private Integer qty;

  @ManyToOne
  private OrderProductMan orderProduct;

  ....
}


@Entity
@Table
public class OrderProductMan implements Serializable {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Basic(optional = false)
  private Integer opId;

  @Basic(optional = false)
  private int qty;

  @ManyToOne(optional = false)
  private ProductMan produse;

  @ManyToOne(optional = false)
  private OrderMan orders;

  @Transient
  private int totalScheduled;

  @Transient
  private int totalProduced;
   // ...
 }

1 Ответ

2 голосов
/ 13 мая 2011

Богдан, спасибо за публикацию этого. У меня была похожая проблема с именами таблиц с учетом регистра для переносимости 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! Вот моя последняя стратегия 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 у меня не сработало.

...