2011-06-17 60 views
2

Two related database tables with a left join爲什麼Hibernate不能在實體中查找輔助表?


我沒有發現這個問題的答案也被問很多其他論壇。雖然我有表IAS_FORM_BKT_BAYI和IAS_FORM_BKT_BAYI_SO存在於數據庫中,與我得到我的JSF這個異常& Hibernate基於應用程序的註釋實體類(除了下面的源代碼):

org.hibernate.AnnotationException: Cannot find the expected secondary table: no IAS_FORM_BKT_BAYI available for net.ozar.bpm.entity.bkt.Bayi 
    org.hibernate.cfg.Ejb3Column.getJoin(Ejb3Column.java:293) 
    org.hibernate.cfg.Ejb3Column.getTable(Ejb3Column.java:272) 
    org.hibernate.cfg.annotations.SimpleValueBinder.make(SimpleValueBinder.java:222) 
    org.hibernate.cfg.AnnotationBinder.bindId(AnnotationBinder.java:1898) 
    org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:1279) 
    org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:754) 
    org.hibernate.cfg.AnnotationConfiguration.processArtifactsOfType(AnnotationConfiguration.java:546) 
    org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:291) 
    org.hibernate.cfg.Configuration.buildMappings(Configuration.java:1148) 
    org.hibernate.ejb.Ejb3Configuration.buildMappings(Ejb3Configuration.java:1226) 
    org.hibernate.ejb.EventListenerConfigurator.configure(EventListenerConfigurator.java:173) 
    org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:854) 
    org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:191) 
    org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:253) 
    org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:125) 
    javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:83) 
    javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:60) 
    net.ozar.bpm.util.EntityUtil.getEntityManagerFactory(EntityUtil.java:13) 
    net.ozar.bpm.util.EntityUtil.getEntityManager(EntityUtil.java:21) 
    net.ozar.bpm.servisler.CalisanJpaController.getEntityManager(CalisanJpaController.java:31) 
    net.ozar.bpm.servisler.CalisanJpaController.getPersonId(CalisanJpaController.java:120) 
    net.ozar.bpm.web.jsfmanaged.LoginBean.oturumAc(LoginBean.java:122) 
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    java.lang.reflect.Method.invoke(Unknown Source) 
    org.apache.el.parser.AstValue.invoke(AstValue.java:191) 
    org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276) 
    com.sun.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:68) 
    javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88) 
    com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102) 
    javax.faces.component.UICommand.broadcast(UICommand.java:387) 
    org.ajax4jsf.component.AjaxViewRoot.processEvents(AjaxViewRoot.java:321) 
    org.ajax4jsf.component.AjaxViewRoot.broadcastEvents(AjaxViewRoot.java:296) 
    org.ajax4jsf.component.AjaxViewRoot.processPhase(AjaxViewRoot.java:253) 
    org.ajax4jsf.component.AjaxViewRoot.processApplication(AjaxViewRoot.java:466) 
    com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:82) 
    com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100) 
    com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) 
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:265) 
    org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:178) 
    org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290) 
    org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:390) 
    org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:517) 
    net.ozar.bpm.web.filters.RestrictPageFilter.doFilter(RestrictPageFilter.java:180) 

八一的.java

@Entity 
@Table(name = "IAS_FORM_BKT_BAYI") 
@SecondaryTable(name="IAS_FORM_BKT_BAYI_SO", pkJoinColumns = @PrimaryKeyJoinColumn(name="CUSTOMER_ID")) 
public class Bayi implements Serializable { 
private static final long serialVersionUID = 8681843504687728382L; 
    @Id 
    @Basic(optional = false) 
    @NotNull 
    @Column(table="IAS_FORM_BKT_BAYI", name = "CUSTOMER_ID", nullable = false) 
    private Integer customerId; 
    @Basic(optional = false) 
    @NotNull 
    @Size(min = 1, max = 30) 
    @Column(table="IAS_FORM_BKT_BAYI", name = "CUSTOMER_NUMBER", nullable = false, length = 30) 
    private String customerNumber; 
    @Size(max = 50) 
    @Column(table="IAS_FORM_BKT_BAYI", name = "CUSTOMER_NAME", length = 50) 
    private String customerName; 
    @Size(max = 50) 
    @Column(table="IAS_FORM_BKT_BAYI", name = "VERGI_DAIRESI", length = 50) 
    private String vergiDairesi; 
    @Size(max = 20) 
    @Column(table="IAS_FORM_BKT_BAYI", name = "VERGI_NO", length = 20) 
    private String vergiNo; 
    @Size(max = 150) 
    @Column(table="IAS_FORM_BKT_BAYI", name = "OPERATOR", length = 150) 
    private String operator; 
    @Column(table="IAS_FORM_BKT_BAYI_SO", name = "SOZLESME", length = 5) 
    private String sozlesme; 
    @Column(table="IAS_FORM_BKT_BAYI_SO", name = "SOZLESME_UYGUN", length = 5) 
    private String sozlesmeUygun; 
    @Column(table="IAS_FORM_BKT_BAYI_SO", name = "KEFIL_IMZA", length = 5) 
    private String kefilImza; 
    @Column(table="IAS_FORM_BKT_BAYI_SO", name = "ACIKLAMA", length = 2000) 
    private String aciklama; 

    public Bayi() { 
    } 

    // getters and setters 
    // ... 

} 

我真正想實現的就是讓我得到運行映射到八一(實體)對象下面的查詢結果集:

SELECT B.CUSTOMER_ID, B.CUSTOMER_NUMBER, B.CUSTOMER_NAME, B.VERGI_DAIRESI, 
B.VERGI_NO, C.SOZLESME, C.SOZLESME_UYGUN, C.KEFIL_IMZA, C.ACIKLAMA FROM 
IAS_FORM_BKT_BAYI B LEFT JOIN IAS_FORM_BKT_BAYI_SO C ON B.CUSTOMER_ID = 
C.CUSTOMER_ID WHERE ORG_ID = 102 

回答

5

當我讀錯誤消息正確時,然後Hibernate嘗試訪問IAS_FORM_BKT_BAYI作爲輔助表。但IAS_FORM_BKT_BAYI是您的主要表格而非輔助表格。

一個快速瀏覽一下一些例子(我從來沒有用過@SecondaryTable)前後,我的接縫休眠預計只針對映射到輔助表的屬性@Column屬性table名稱。 (這符合錯誤信息)

所以我想你應該從映射到主表的屬性的@Column屬性中刪除table="IAS_FORM_BKT_BAYI"

0

它沒有看到你的代碼親愛的任何問題,但可能是它似乎是一個休眠的問題,儘量用小信你的表名和子表的名稱,然後它會正常工作

從上轉換,以降低案件爲我工作,我希望它也適用於你。

@Entity 
@Table(name = "ias_form_bkt_bayi") 
@SecondaryTable(name="ias_form_bkt_bayi_so", pkJoinColumns = @PrimaryKeyJoinColumn(name="customer_id")) 
1

*「的快看一些例子(我從來沒有用過@SecondaryTable)之前,我是接縫休眠期望在@Column表名只對映射到輔助表的屬性屬性之後。(這匹配錯誤信息) 所以我想你應該從映射到主表的屬性的@Column屬性中刪除table =「IAS_FORM_BKT_BAYI」。「*

這在我的例子中是非常正確和相同的。如果該字段屬於輔助表,Hibernate(3.0)將僅查找表屬性。 對於屬於主表的字段,不需要表屬性。 我刪除了,並與離開「無法找到輔助表」錯誤。 從框架的角度來看很奇怪!它可能被預測爲壓制警告註釋...

謝謝, Pratik

相關問題