2013-12-12 2 views
2

Я не могу понять, в чем проблема. Я надеюсь, что кто-то может мне помочь. я получаю это исключение:У внешнего ключа есть неправильное количество столбцов

Caused by: org.hibernate.AnnotationException: A Foreign key refering com.domain.LocaleJpaImpl from com.engine.i18n.domain.LanguageToLocaleJpaImpl has the wrong number of column. should be 2 
at org.hibernate.cfg.annotations.TableBinder.bindFk(TableBinder.java:420) ~[hibernate-core-jar-4.1.8.Final.jar:4.1.8.Final] 
    at org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.java:117) ~[hibernate-core-jar-4.1.8.Final.jar:4.1.8.Final] 
    at org.hibernate.cfg.Configuration.processEndOfQueue(Configuration.java:1525) ~[hibernate-core-jar-4.1.8.Final.jar:4.1.8.Final] 
    at org.hibernate.cfg.Configuration.processFkSecondPassInOrder(Configuration.java:1446) ~[hibernate-core-jar-4.1.8.Final.jar:4.1.8.Final] 
    at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1351) ~[hibernate-core-jar-4.1.8.Final.jar:4.1.8.Final] 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1737) ~[hibernate-core-jar-4.1.8.Final.jar:4.1.8.Final] 
    at org.hibernate.ejb.EntityManagerFactoryImpl.<init>(EntityManagerFactoryImpl.java:94) ~[hibernate-entitymanager-jar-4.1.8.Final.jar:4.1.8.Final] 
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:905) ~[hibernate-entitymanager-jar-4.1.8.Final.jar:4.1.8.Final] 

У меня есть две сущности LocaleJpa и LanguageToLocaleJpa. Каждый языкToLocaleJpa имеет два отношения с двумя разными языками LocaleJpa. Эти 2 отношения ограничены 2 внешних ключей:

fk on LANGUAGE_TO_LOCALE table

LocaleJpa имеет следующий код:

package com.engine.i18n.domain; 

    import java.util.Date; 
    import java.util.HashSet; 
    import java.util.Set; 

    import javax.persistence.Column; 
    import javax.persistence.Entity; 
    import javax.persistence.FetchType; 
    import javax.persistence.GeneratedValue; 
    import javax.persistence.GenerationType; 
    import javax.persistence.Id; 
    import javax.persistence.OneToMany; 
    import javax.persistence.Table; 

    import com.jpa.BaseEntityJpaSupport; 

    @Entity 
    @Table(name = "LOCALE") 
    public class LocaleJpaImpl extends BaseEntityJpaSupport implements java.io.Serializable, LocaleJpa { 

    private static final long serialVersionUID = -6405562403744775413L; 

    @Id() 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name="LOCALE_ID", unique=true, nullable=false) 
    private int localeId; 


    @Column(name="LANGUAGE_CODE", length=2) 
    private String languageCode; 

    @Column(name="COUNTRY_CODE", length=2) 
    private String countryCode; 

    @Column(name="VARIANT_CODE", length=10) 
    private String variantCode; 

    @Column(name="FLAG_ICON_URL", length=100) 
    private String flagIconUrl; 

    @OneToMany(fetch=FetchType.LAZY, mappedBy="localeByLocaleId") 
    private Set <LanguageToLocaleJpaImpl> languageToLocalesForLocaleId = new HashSet <LanguageToLocaleJpaImpl> (0); 

    @OneToMany(fetch=FetchType.LAZY, mappedBy="localeByLanguageId") 
    private Set <LanguageToLocaleJpaImpl> languageToLocalesForLanguageId = new HashSet<LanguageToLocaleJpaImpl> (0); 

    public LocaleJpaImpl() { 
    } 

    public LocaleJpaImpl(int localeId, Date createdDate) { 
     this.createdDate = createdDate; 
    } 

    public LocaleJpaImpl(int localeId, Date createdDate, String languageCode, String countryCode, String variantCode, String flagIconUrl, Set <LanguageToLocaleJpaImpl> languageToLocalesForLocaleId,  Set <LanguageToLocaleJpaImpl> languageToLocalesForLanguageId) { 
     this.createdDate = createdDate; 
     this.languageCode = languageCode; 
     this.countryCode = countryCode; 
     this.variantCode = variantCode; 
     this.flagIconUrl = flagIconUrl; 
     this.languageToLocalesForLocaleId = languageToLocalesForLocaleId; 
     this.languageToLocalesForLanguageId = languageToLocalesForLanguageId; 
    } 

    @Override 
    public int getLocaleId() { 
     return this.localeId; 
    } 

    @Override 
    public void setLocaleId(int localeId) { 
     this.localeId = localeId; 
    } 

    @Override 
    public String getLanguageCode() { 
     return this.languageCode; 
    } 

    @Override 
    public void setLanguageCode(String languageCode) { 
     this.languageCode = languageCode; 
    } 

    @Override 
    public String getCountryCode() { 
     return this.countryCode; 
    } 

    @Override 
    public void setCountryCode(String countryCode) { 
     this.countryCode = countryCode; 
    } 

    @Override 
    public String getVariantCode() { 
     return this.variantCode; 
    } 

    @Override 
    public void setVariantCode(String variantCode) { 
     this.variantCode = variantCode; 
    } 

    @Override 
    public String getFlagIconUrl() { 
     return this.flagIconUrl; 
    } 

    @Override 
    public void setFlagIconUrl(String flagIconUrl) { 
     this.flagIconUrl = flagIconUrl; 
    } 

    @Override 
    public Set<LanguageToLocaleJpaImpl> getLanguageToLocalesForLocaleId() { 
     return this.languageToLocalesForLocaleId; 
    } 

    @Override 
    public void setLanguageToLocalesForLocaleId(Set <LanguageToLocaleJpaImpl> languageToLocalesForLocaleId) { 
     this.languageToLocalesForLocaleId = languageToLocalesForLocaleId; 
    } 


    } 

LanguageToLocaleJpaImpl имеет следующий код:

package com.engine.i18n.domain; 

import java.io.Serializable; 

import javax.persistence.CascadeType; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.FetchType; 
import javax.persistence.Id; 
import javax.persistence.JoinColumn; 
import javax.persistence.ManyToOne; 
import javax.persistence.Table; 

import org.hibernate.annotations.Type; 

import com.domain.LanguageToLocale; 
import com.jpa.BaseEntityJpaSupport; 

@Entity 
@Table(name = "LANGUAGE_TO_LOCALE") 
public class LanguageToLocaleJpaImpl extends BaseEntityJpaSupport implements Serializable, LanguageToLocale { 


private static final long serialVersionUID = 1L; 

@Id 
@Column(name="LANGUAGE_TO_LOCALE_ID", unique=true, nullable=false) 
private int languageToLocaleId; 

@ManyToOne(fetch=FetchType.LAZY, cascade=CascadeType.ALL) 
    @JoinColumn(name="LOCALE_ID", nullable=false) 
private LocaleJpaImpl countryLocale; 

@ManyToOne(fetch=FetchType.LAZY, cascade=CascadeType.ALL) 
@JoinColumn(name="LANGUAGE_ID", nullable=false) 
private LocaleJpaImpl languageLocale; 

@Column(name = "ACTIVE_FLAG") 
@Type(type="yes_no") 
private boolean active; 

@Column(name = "DEFAULT_FLAG") 
@Type(type="yes_no") 
private boolean defaultFlag; 

@Override 
public int getLanguageToLocaleId() { 
    return languageToLocaleId; 
} 

@Override 
public void setLanguageToLocaleId(int languageToLocaleId) { 
    this.languageToLocaleId = languageToLocaleId; 
} 

@Override 
public LocaleJpaImpl getCountryLocale() { 
    return countryLocale; 
} 

@Override 
public void setCountryLocale(LocaleJpaImpl countryLocale) { 
    this.countryLocale = countryLocale; 
} 

@Override 
public LocaleJpaImpl getLanguageLocale() { 
    return languageLocale; 
} 

@Override 
public void setLanguageLocale(LocaleJpaImpl languageLocale) { 
    this.languageLocale = languageLocale; 
} 


@Override 
public int getLocaleId() {  
    return this.countryLocale.getLocaleId(); 
} 

@Override 
public void setLocaleId(int localeId) { 
    throw new UnsupportedOperationException(); 
} 

@Override 
public int getLanguageId() { 
    return this.languageLocale.getLocaleId(); 
} 

@Override 
public void setLanguageId(int languageId) { 
    throw new UnsupportedOperationException(); 
} 

@Override 
public String toString() { 
    StringBuilder builder = new StringBuilder(super.toString()); 

    builder.append("localeId: ").append(getLocaleId()).append("\n"); 
    builder.append("languageId: ").append(getLanguageId()).append("\n"); 
    builder.append("default: ").append(isActive()).append("\n"); 
    builder.append("active: ").append(isDefaultFlag()).append("\n"); 

    return builder.toString(); 
} 

@Override 
public boolean isActive() { 
    return active; 
} 

@Override 
public void setActive(boolean active) { 
    this.active = active; 
} 

@Override 
public boolean isDefaultFlag() { 

    return this.defaultFlag; 
} 

@Override 
public void setDefaultFlag(boolean defaultFlag) { 
    this.defaultFlag = defaultFlag; 
} 

}

Любая идея? Спасибо заранее!

+0

Сообщение: 'LanguageToLocaleJpaImpl' –

ответ

4

В сущности неправильно отображаются: в LocaleJpa, где у вас есть обратные отношения к вашим LanguageToLocaleJpa лицам, вам нужно использовать имя свойства Java вместо имени столбца БД. Также вы копируете/вставляете их.

Оно должно быть:

@OneToMany(fetch=FetchType.LAZY, mappedBy="countryLocale") 
private Set <LanguageToLocaleJpaImpl> countryToLocalesForLocaleId = new HashSet <LanguageToLocaleJpaImpl> (0); 

@OneToMany(fetch=FetchType.LAZY, mappedBy="languageLocale") 
private Set <LanguageToLocaleJpaImpl> languageToLocalesForLanguageId = new HashSet<LanguageToLocaleJpaImpl> (0); 
+0

Спасибо, но с этой модификацией noé я получаю это исключение: у вас есть какие-либо идеи aboutits происхождения? Вызвано: org.hibernate.AnnotationException: referendedColumnNames (LOCALE_ID) of com.engine.i18n.domain.LanguageToLocaleJpaImpl.countryLocale ссылается на com.engine.i18n.domain.LocaleJpaImpl не сопоставляется с одним свойством –

Смежные вопросы