簡體   English   中英

與JPA的@OneToOne關系

[英]@OneToOne relationship with JPA

我正在為我的大學進行一個項目。 這是像AirBnb這樣的預訂系統。 系統內部有兩個實體:請求和結構。 沒有相關請求,無法插入結構。 因此,我以這種方式對請求建模:

public class Request {
      //...attributes (with a Generated Id)..//

      @OneToOne(optional=false)
      @JoinColumn(
        name="structure_id", unique=true, nullable=false, updatable=false)
      private Structure structure;
}

和結構:

public class Structure{
      //...attributes (with a Generated Id)..//
     private Request request;

     @OneToOne(optional=false, mappedBy="structure")
     public Request getRequest() {
     return request;
}

每次我嘗試測試該應用程序時,它在

Persistence.createEntityManagerFactory()

出現此錯誤消息:

Stacktrace:]的根本原因是org.hibernate.MappingException:無法確定以下類型:it.ispw.efco.nottitranquille.model.Structure,在表:Request處,用於列:[org.hibernate.mapping.Column(structure)]在org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:396)在org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:369)在org.hibernate.mapping.Property.isValid(Property.java:225) )的org.hibernate.boot.internal.MetadataImpl.validate(MetadataImpl。)的org.hibernate.mapping.RootClass.validate(RootClass.java:265)的org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:529) org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:443)上的org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:879)上的org.hibernate.jpa .HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:58)在javax.persistence.Persistence.createEntityMana gerFactory(Persistence.java:55)位於javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:39)位於it.ispw.efco.nottitranquille.model.JPAInitializer。(JPAInitializer.java:25)位於it.ispw.efco。在it.ispw.efco.nottitranquille.model.CatalogueDAO.saveRequest(CatalogueDAO.java:26)上的nottitranquille.model.JPAInitializer.getEntityManager(JPAInitializer.java:43)在it.ispw.efco.nottitranquille.view.SearchBean.validate( org.apache.jsp.search_jsp._jspService(search_jsp.java:134)的SearchBean.java:79)org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)的javax.servlet.http.HttpServlet org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)上的org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:438)上的.service(HttpServlet.java:729) org.apache.catalina.core.ApplicationFilterChain.internalDoFilt上的javax.servlet.http.HttpServlet.service(HttpServlet.java:729)上的apache.jasper.servlet.JspServlet.service(JspServlet.java:340) er(ApplicationFilterChain.java:291)(位於org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)(位於org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)) org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)處的.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)在org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve .java:219)位於org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)位於org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)位於org.apache.catalina。 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)處的core.StandardHostValve.invoke(StandardHostValve.java:142)在org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:617)在org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)上 t org.apache.coyote.http11上的org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518)org.apache.coyote.AbstractProtocol $ AbstractConnectionHandler.process上的org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091) (AbstractProtocol.java:668)在org.apache.tomcat.util.net.NioEndpoint $ SocketProcessor.doRun(NioEndpoint.java:1521)在org.apache.tomcat.util.net.NioEndpoint $ SocketProcessor.run(NioEndpoint.java :1478),位於java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145),位於org.apache.tomcat.util.threads處的java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:615)。 TaskThread $ WrappingRunnable.run(TaskThread.java:61)位於java.lang.Thread.run(Thread.java:745)

無法在數據庫內部映射這種關系? (Windows 10上為MySQL 5.7.10)如果沒有結構,請求將無法生存,反之亦然。 我該如何解決? 提前非常感謝您!

編輯1:我現在收到此新錯誤:

org.hibernate.TransientPropertyValueException:對象引用了一個未保存的瞬態實例-在刷新之前保存該瞬態實例:it.ispw.efco.nottitranquille.model.Structure.request-> it.ispw.efco.nottitranquille.model.Request

這個代碼正確嗎? 請求應該保存與其鏈接的結構,對嗎?

    Address address = new Address(//some fields//);
    Structure structure = new Structure(/*a name*/,address);
    Request request = new Request(structure);
    CatalogueDAO catalogueDAO = new CatalogueDAO();
    catalogueDAO.saveRequest(request);

編輯2:

通過在Request.structure的@OneToOne上添加(cascade = CascadeType.ALL)解決了先前的問題

但是現在我得到了:

不能添加或更新子行,外鍵約束失敗( notti_tranquillerequest ,約束FKbi1rasm9sdgrouh2mdklvi2q外鍵( id )參考structureaddress_id ))

結構具有另一個屬性:地址,具有自己的ID和簡單屬性

@OneToOne @MapsId
private Address address;

但是,如果檢查由JPA創建的表,我會看到該表結構具有作為主鍵的address_id ...為什么?

為什么在getRequest()上方添加注釋? 試試這個

public class Structure{
  //...attributes (with a Generated Id)..//
@OneToOne(optional=false, mappedBy="structure")
 private Request request;


 public Request getRequest() {
 return request;

}

您是否嘗試刪除此注釋@JoinColumn(name =“ structure_id”,unique = true,nullable = false,updatable = false)。 在這里您可以找到工作示例一對一示例

暫無
暫無

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

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