2016-08-25 160 views
1

我試圖使我的表Loj_Cupons與Fat_Pedido非主鍵關係,並從SQL Server返回一個選擇值。關係非主鍵@OneToOne休眠JPA

我從休眠中發現這個錯誤。

Caused by: org.hibernate.MappingException: broken column mapping for: lojCupom.id of: br.com.microdatasistemas.simintegrationws.entity.FatPedido

我多次嘗試和改變的關係,Fat_Pedido到Loj_Cupons太喜歡這一點。

ON Loj_Cupons表。

@OneToOne(fetch = FetchType.EAGER) 
      @JoinColumns({ 
        @JoinColumn(name = "Empresa_Pedido", referencedColumnName = "Empresa", insertable = false, updatable = false), 
        @JoinColumn(name = "Pedido_Fat", referencedColumnName = "Pedido", insertable = false, updatable = false) }) 
      private FatPedido fatPedido; 

ON Fat_Pedido Table。

@OneToOne(mappedBy = "lojCupom") 
    private LojCupom lojCupom; 

任何人都知道如何做出正確的關係嗎?我Google搜索了2天,但沒有找到真正的答案。

圖片從我的數據庫列。 enter image description here

來自Java的類。

@Entity 
@Table(name = "Loj_Cupons") 
public class LojCupom implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @EmbeddedId 
    private LojCupomPK id; 

    @Column(name = "Empresa_Pedido") 
    private String empresaPedido; 

    @Column(name = "Pedido_Fat") 
    private String pedidoFat; 

    @OneToOne(mappedBy = "lojCupom")  
    private FatPedido fatPedido; 

    public LojCupom() { 
     this.setId(new LojCupomPK()); 
    } 

    getters/setters!  
} 



@Embeddable 
public class LojCupomPK implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Column(name = "Empresa",insertable=false,updatable=false) 
    private String empresa; 

    @Column(name = "Maquina",insertable=false,updatable=false) 
    private String maquina; 

    @Temporal(TemporalType.TIMESTAMP) 
    @Column(name = "Data",insertable=false,updatable=false) 
    private Calendar data; 

    @Column(name = "Controle",insertable=false,updatable=false) 
    private Long controle; 

    public LojCupomPK() {} 

    public LojCupomPK(String Empresa, String Maquina, Calendar Data, Long Controle) { 
     this.setEmpresa(Empresa); 
     this.setMaquina(Maquina); 
     this.setData(Data); 
     this.setControle(Controle);  
    } 

    getters/setters!  

    HashCode() & Equals() 
} 



@Entity 
@Table(name = "Fat_Pedido") 
public class FatPedido implements Serializable { 
    private static final long serialVersionUID = -1618058067896057649L; 

    @EmbeddedId 
    private FatPedidoPK id; 

    @OneToOne(fetch = FetchType.EAGER) 
    @JoinColumns({ 
      @JoinColumn(name = "Empresa", referencedColumnName = "Empresa_Pedido", insertable = false, updatable = false), 
      @JoinColumn(name = "Pedido", referencedColumnName = "Pedido_Fat", insertable = false, updatable = false) }) 
    private LojCupom lojCupom; 

    public FatPedido() { 
     this.setId(new FatPedidoPK()); 
    } 

    getters/setters! for id. 



@Embeddable 
public class FatPedidoPK implements Serializable { 
    private static final long serialVersionUID = 249206612929570749L; 

    @Column(name = "Empresa",insertable = false, updatable = false) 
    private String empresa; 


    @Column(name = "Pedido",insertable = false, updatable = false) 
    private String pedido; 

    public FatPedidoPK() { 
    } 

    public FatPedidoPK(String empresa,String pedido){ 
     this.setEmpresa(empresa); 
     this.setPedido(pedido); 
    } 

    getters/setters! 

    HashCode() & Equals() 

} 

Class to call Factory。

public LojCupom findLojCupons(LojCupom lojCupom) throws Exception { 
     return new LojCupomFactory().findLojCupons(lojCupom); 
} 


public LojCuponsOM convertFrom(LojCupom lojCupom, LojCuponsOM lojCuponsOM) { 

     lojCuponsOM.setEmpresaPedido(lojCupom.getFatPedido().getId().getEmpresa()); 
     lojCuponsOM.setPedidoFat(lojCupom.getFatPedido().getId().getPedido()); 
     lojCuponsOM.getFatPedido().setNrNota(lojCupom.getFatPedido().getNrNota()); 
     lojCuponsOM.getFatPedido().setSerie(lojCupom.getFatPedido().getSerie()); 
     lojCuponsOM.getFatPedido().setDataNota(lojCupom.getFatPedido().getDataNota()); 
     lojCuponsOM.getFatPedido().setVrNota(lojCupom.getFatPedido().getVrNota()); 
} 




public class LojCupomFactory { 
    public LojCupom findLojCupons(LojCupom cupons) throws Exception{ 
     return new LojCupomDAOImple().findLojCupons(cupons);   
    } 

} 





public class LojCupomDAOImple implements LojCupomDAO { 

    @Override 
    public LojCupom findLojCupons(LojCupom cupons) throws Exception { 
     EntityManager em = FactoryHibernate.getInstance().getEntityManager(); 

      Criteria criteria = ((Session) em.getDelegate()).createCriteria(LojCupom.class); 
      if (cupons != null && cupons.getId().getEmpresa() != null && cupons.getId().getMaquina() != null 
        && cupons.getId().getData() != null && cupons.getId().getControle() != null) { 
       criteria.add(Restrictions.eq("id", cupons.getId())); 
      } 

      cupons = (LojCupom) criteria.uniqueResult(); 


     return cupons; 
} 

當我運行代碼時,控制檯出現錯誤。

javax.persistence.PersistenceException: [PersistenceUnit: persistence] Unable to build EntityManagerFactory 
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:915) 
    at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:57) 
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:48) 
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:32) 
    at br.com.microdata.component.persistence.FactoryHibernate.<init>(FactoryHibernate.java:33) 
    at br.com.microdata.component.persistence.FactoryHibernate.getInstance(FactoryHibernate.java:39) 
    at br.com.microdatasistemas.simintegrationws.dao.impl.LojCupomDAOImple.findLojCupons(LojCupomDAOImple.java:17) 
    at br.com.microdatasistemas.simintegrationws.factory.LojCupomFactory.findLojCupons(LojCupomFactory.java:8) 
    at br.com.microdatasistemas.simintegrationws.facade.LojCuponsFacade.findLojCupons(LojCuponsFacade.java:43) 
    at br.com.microdatasistemas.simintegrationws.facade.LojCuponsFacade.searchLojCupons(LojCuponsFacade.java:34) 
    at br.com.microdatasistemas.simintegrationws.impl.LojCuponsImpl.SetLojCupons(LojCuponsImpl.java:20) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.apache.axis2.rpc.receivers.RPCUtil.invokeServiceClass(RPCUtil.java:212) 
    at org.apache.axis2.rpc.receivers.RPCMessageReceiver.invokeBusinessLogic(RPCMessageReceiver.java:117) 
    at org.apache.axis2.receivers.AbstractInOutMessageReceiver.invokeBusinessLogic(AbstractInOutMessageReceiver.java:40) 
    at org.apache.axis2.receivers.AbstractMessageReceiver.receive(AbstractMessageReceiver.java:114) 
    at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:181) 
    at org.apache.axis2.transport.http.HTTPTransportUtils.processHTTPPostRequest(HTTPTransportUtils.java:172) 
    at org.apache.axis2.transport.http.AxisServlet.doPost(AxisServlet.java:146) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:650) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:731) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:956) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:436) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1078) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:625) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Unknown Source) 
Caused by: org.hibernate.MappingException: broken column mapping for: lojCupom.id of: br.com.microdatasistemas.simintegrationws.entity.FatPedido 
    at org.hibernate.persister.entity.AbstractPropertyMapping.initPropertyPaths(AbstractPropertyMapping.java:180) 
    at org.hibernate.persister.entity.AbstractPropertyMapping.initIdentifierPropertyPaths(AbstractPropertyMapping.java:251) 
    at org.hibernate.persister.entity.AbstractPropertyMapping.initPropertyPaths(AbstractPropertyMapping.java:224) 
    at org.hibernate.persister.entity.AbstractEntityPersister.initOrdinaryPropertyPaths(AbstractEntityPersister.java:1863) 
    at org.hibernate.persister.entity.AbstractEntityPersister.initPropertyPaths(AbstractEntityPersister.java:1902) 
    at org.hibernate.persister.entity.AbstractEntityPersister.postConstruct(AbstractEntityPersister.java:3128) 
    at org.hibernate.persister.entity.SingleTableEntityPersister.<init>(SingleTableEntityPersister.java:439) 
    at org.hibernate.persister.PersisterFactory.createClassPersister(PersisterFactory.java:84) 
    at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:286) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1872) 
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:906) 
    ... 43 more 

回答

0

看看你的數據庫表我看到表Loj_Cupons包含外鍵。所以與此表相對應的實體,即LojCupom應該是OneToOne關係的所有者。這就是你必須把JoinColumns標註的實體:(注意改變加入的列名:Empresa_Pedido(FK) - > Empresa與(PK)和Pedido_Fat(FK) - > Pedido(PK))

@Entity 
@Table(name = "Loj_Cupons") 
public class LojCupom implements Serializable {# 

    ... 

    @OneToOne  
    @JoinColumns({ 
     @JoinColumn(name = "Empresa_Pedido", referencedColumnName = "Empresa"), 
     @JoinColumn(name = "Pedido_Fat", referencedColumnName = "Pedido") }) 
    private FatPedido fatPedido; 

    ... 

} 

而實體FatPedido是反面;所以你註釋,如下所示:

@Entity 
@Table(name = "Fat_Pedido") 
public class FatPedido implements Serializable { 

    ... 

    @OneToOne(mappedBy = "fatPedido") 
    private LojCupom lojCupom; 

    ... 

} 

注:我刪除了insertable = false屬性只是爲了節省一些按鍵;並且updateable = false不是必需的,因爲ID字段不可修改。如果您認爲您的實體只讀您可以使用它們。

希望它可以幫助你。

+0

感謝您的幫助和時間! –

+0

不客氣! – ujulu