2011-01-31 84 views
13

我试图强制JPA/Hibernate生成和使用只有小写的表名。我实现了一个命名是这样的:“org.hibernate.DuplicateMappingException”错误是什么意思?

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) 

什么是

Same phy sical表名[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; 
    // ... 
} 
+0

您能否提供更多信息 - 就像您实体的映射一样。 – Bozho 2011-01-31 15:30:08

+0

我已更新我的问题。让我知道你是否需要更多。谢谢! – Bogdan 2011-01-31 15:42:59

回答

2

Bogdan,感谢您发布此信息。在Linux上,使用Hibernate/JPA/MySQL的Unix/Windows可移植性对于区分大小写的表名有类似的问题。

和你一样,我开始在我的META-INF/persistence.xml文件配置自定义NamingStrategy绑定我的表名作为全小写:

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

我得到了同样的异常:组织.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以前的解决方案并不适合我。