2011-01-31 26 views
13

JPA/Hazırda Bekletme'yi yalnızca küçük harfli tablenames oluşturmak ve kullanmak için zorlamaya çalışıyorum. Böyle bir NamingStrategy uyguladık:"org.hibernate.DuplicateMappingException" hatası ne anlama geliyor?

Ben persistence.xml bu özelliğini ayarlayarak uyguladığımızı
public class MyNamingStrategy extends DefaultNamingStrategy { 

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

:

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) 
: Bunu yaptığınızda

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

Bu stacktrace olsun

Aynı phy nedir? sical tablo adı [planning] birkaç mantıksal tablo ismi başvurur: [Planning], [OrderProductMan_Planning]

ne demek?

Hatasından gelen varlıklar, olabildiğince basitleştirilmiş. Gerisine ihtiyacın olursa haberim olsun.

@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

Kurumunuzun eşlemeleri gibi biraz daha fazla bilgi verebilir misiniz? – Bozho

+0

Sorumu güncelledim. Daha fazlasına ihtiyacın olursa haberim olsun. Teşekkürler! – Bogdan

+0

Halihazırda var olan tabloları oluşturmaya çalışmadığınızdan emin misiniz? Mesaj: 'Aynı fiziksel tablo adı [planlama] birkaç mantıksal tablo ismine başvurur: [Planning]' bana büyük harf versiyonunun zaten orada olabileceğini ve daha az kasalı versiyonun oluşturulamayacağını düşünmemi sağlar. Çoğu DB motorunun büyük/küçük harfe duyarlı olmadığını unutmayın. –

cevap

2

Bogdan, bunu gönderdiğiniz için teşekkür ederiz. Linux'ta Hibernate/JPA/MySQL kullanarak Unix/Windows taşınabilirliği için büyük-küçük harf duyarlı isimlerle benzer bir sorun yaşadım.

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

Aynı durum var:

Senin gibi, benim META-INF/persistence.xml dosyasındaki bir özel NamingStrategy yapılandırarak tüm alt vaka olarak benim masa isimleri bağlamak için yola org .hibernate.DuplicateMappingException: Aynı fiziksel tablo adı ... Hata ayıklayıcısını kullanarak, belki de ile başladığım bir Epiphany'i kullanmaya başladım. DefaultNamingStrategy kullanmaya başladım! Bu yüzden temel dersimi org.hibernate.cfg.EJB3NamingStrategy olarak değiştirdim. Bu JPA Ek Açıklamaları kullanırken daha uygun, ben inanıyorum! Burada benim son 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 bir önceki çözüm benim için dursun çalışmadı.

+0

Bence ImprovedNamingStrategy kullanarak sorunu çözdüm. Bu her şeye dikkat etti: küçük harfler + alt çizgiler; Ayrıca bir epifanım da vardı: Neler olup bittiğini tam olarak kontrol etmeyi istediğimi anladım. Bu yüzden JPA/açıklama notlarını bıraktım ve hazırda bulunan eşleştirmelere geçtim. O zamandan beri mutlu oldum :) – Bogdan