簡體   English   中英

關系非主鍵@OneToOne Hibernate JPA

[英]relationship non primary key @OneToOne Hibernate JPA

我嘗試與我的表Loj_Cupons建立非主鍵關系到Fat_Pedido並從SQL Server返回一個選擇值。

我從hibernate中發現了這個錯誤。

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

我嘗試了很多次並且改變了關系,Fat_Pedido也變成了Loj_Cupons。

在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;

在Fat_Pedido表上。

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

誰知道如何做出正確的關系? 我用Google搜索了2天,沒有找到真正的答案。

我的數據庫列中的圖片。 在此輸入圖像描述

來自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()

}

要調用工廠的類。

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

查看數據庫表,我看到表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字段不可修改。 如果您認為您的實體是只讀的 ,則可以使用它們。

希望它能幫到你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM