Java 什么是;org.hibernate.DuplicateMappingException”的;误差平均值?

Java 什么是;org.hibernate.DuplicateMappingException”的;误差平均值?,java,hibernate,jpa,java-ee-6,glassfish-3,Java,Hibernate,Jpa,Java Ee 6,Glassfish 3,我试图强制JPA/Hibernate生成并只使用小写的表名。我已经实施了如下的NamingStrategy: public class MyNamingStrategy extends DefaultNamingStrategy { @Override public String classToTableName(String className) { return super.classToTableName(className).toLowerCase(); } }

我试图强制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"/>
这是什么意思

相同的物理表名[planning]引用多个逻辑表名:[planning],[OrderProductMan\u 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;
   // ...
 }

博格丹,谢谢你发这个帖子。在Linux上使用Hibernate/JPA/MySQL实现Unix/Windows可移植性时,我遇到了类似的大小写敏感表名问题

和您一样,我也开始通过在META-INF/persistence.xml文件中配置自定义NamingStrategy将表名绑定为小写:

<property name="hibernate.ejb.naming_strategy" value="my.package.LowerCaseNamingStrategy" />

PS dursun以前的解决方案对我不起作用。

你能提供更多的信息吗?比如你实体的映射。我已经更新了我的问题。如果你需要更多,请告诉我。谢谢是否确实不尝试创建已存在的表?消息:
相同的物理表名[planning]引用了多个逻辑表名:[planning]
使我认为大写版本可能已经存在,而小写版本无法创建。请记住,大多数DB引擎不区分大小写。我想我通过使用改进的命名策略解决了这个问题。这解决了所有问题:小写名称+下划线;我也有一个顿悟:我意识到我想要完全控制正在发生的事情,所以我放弃了JPA/注释的东西,转而使用hibernate映射。从那以后我一直很快乐:)
<property name="hibernate.ejb.naming_strategy" value="my.package.LowerCaseNamingStrategy" />
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));
    }
}