简体   繁体   English

与JPA的@OneToOne关系

[英]@OneToOne relationship with JPA

I'm working on a project for my University. 我正在为我的大学进行一个项目。 It's a booking system like AirBnb. 这是像AirBnb这样的预订系统。 Inside the system there are two entities: Request and Structure. 系统内部有两个实体:请求和结构。 A Structure cannot be inserted without a relative Request. 没有相关请求,无法插入结构。 So I modelled Request in this way: 因此,我以这种方式对请求建模:

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

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

And Structure: 和结构:

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

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

Each time I try to test the application, it fails during 每次我尝试测试该应用程序时,它在

Persistence.createEntityManagerFactory() Persistence.createEntityManagerFactory()

with this error message: 出现此错误消息:

Stacktrace:] with root cause org.hibernate.MappingException: Could not determine type for: it.ispw.efco.nottitranquille.model.Structure, at table: Request, for columns: [org.hibernate.mapping.Column(structure)] at org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:396) at org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:369) at org.hibernate.mapping.Property.isValid(Property.java:225) at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:529) at org.hibernate.mapping.RootClass.validate(RootClass.java:265) at org.hibernate.boot.internal.MetadataImpl.validate(MetadataImpl.java:329) at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:443) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:879) at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:58) at javax.persistence.Persistence.createEntityMana 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) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:39) at it.ispw.efco.nottitranquille.model.JPAInitializer.(JPAInitializer.java:25) at it.ispw.efco.nottitranquille.model.JPAInitializer.getEntityManager(JPAInitializer.java:43) at it.ispw.efco.nottitranquille.model.CatalogueDAO.saveRequest(CatalogueDAO.java:26) at it.ispw.efco.nottitranquille.view.SearchBean.validate(SearchBean.java:79) at org.apache.jsp.search_jsp._jspService(search_jsp.java:134) at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:438) at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396) at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340) at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilt 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) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:617) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) a 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.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:668) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1521) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1478) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:745) 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)

It's unable to map such relationship inside the DB? 无法在数据库内部映射这种关系? (MySQL 5.7.10 on Windows 10) Request cannot live without a Structure and viceversa. (Windows 10上为MySQL 5.7.10)如果没有结构,请求将无法生存,反之亦然。 How can I solve it? 我该如何解决? Thank you very much in advance! 提前非常感谢您!

EDIT 1: I got this new error now: 编辑1:我现在收到此新错误:

org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing : it.ispw.efco.nottitranquille.model.Structure.request -> it.ispw.efco.nottitranquille.model.Request org.hibernate.TransientPropertyValueException:对象引用了一个未保存的瞬态实例-在刷新之前保存该瞬态实例:it.ispw.efco.nottitranquille.model.Structure.request-> it.ispw.efco.nottitranquille.model.Request

Is this code right? 这个代码正确吗? Request should save the structure linked to it, right? 请求应该保存与其链接的结构,对吗?

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

EDIT 2: 编辑2:

The previous problem is solved by adding (cascade = CascadeType.ALL) on the @OneToOne on Request.structure 通过在Request.structure的@OneToOne上添加(cascade = CascadeType.ALL)解决了先前的问题

But now I got this: 但是现在我得到了:

Cannot add or update a child row: a foreign key constraint fails ( notti_tranquille . request , CONSTRAINT FKbi1rasm9sdgrouh2mdklvi2q FOREIGN KEY ( id ) REFERENCES structure ( address_id )) 不能添加或更新子行,外键约束失败( notti_tranquillerequest ,约束FKbi1rasm9sdgrouh2mdklvi2q外键( id )参考structureaddress_id ))

Structure has another attribute: Address, with its own Id and simple attributes 结构具有另一个属性:地址,具有自己的ID和简单属性

@OneToOne @MapsId
private Address address;

But If I check the tables created by JPA I see that the table structure has as primary key address_id... why? 但是,如果检查由JPA创建的表,我会看到该表结构具有作为主键的address_id ...为什么?

Why is annotation above getRequest()? 为什么在getRequest()上方添加注释? Try do this 试试这个

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


 public Request getRequest() {
 return request;

} }

Did you try to delete this annotation @JoinColumn( name="structure_id", unique=true, nullable=false, updatable=false) . 您是否尝试删除此注释@JoinColumn(name =“ structure_id”,unique = true,nullable = false,updatable = false)。 Here you can find work example one to one example 在这里您可以找到工作示例一对一示例

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM