@OneToOne与JPA

时间:2016-01-10 13:02:48

标签: java mysql hibernate jpa

我正在为我的大学做一个项目。这是一个像AirBnb这样的预订系统。在系统内部有两个实体:请求和结构。如果没有相对请求,则无法插入结构。所以我用这种方式建模Request:

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)       at org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:369)       在org.hibernate.mapping.Property.isValid(Property.java:225)       在org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:529)       在org.hibernate.mapping.RootClass.validate(RootClass.java:265)       在org.hibernate.boot.internal.MetadataImpl.validate(MetadataImpl.java:329)       在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.createEntityManagerFactory(Persistence.java:55)       在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)       在org.apache.jsp.search_jsp._jspService(search_jsp.java:134)       在org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)       在javax.servlet.http.HttpServlet.service(HttpServlet.java:729)       在org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:438)       在org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)       在org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)       在javax.servlet.http.HttpServlet.service(HttpServlet.java:729)       在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(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.internalDoFilter(ApplicationFilterChain.java:239)       在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)       在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.core.StandardHostValve.invoke(StandardHostValve.java:142)       at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)       在org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:617)       在org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)       在org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518)       在org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091)       at org.apache.coyote.AbstractProtocol $ AbstractConnectionHandler.process(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)       at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:615)       at org.apache.tomcat.util.threads.TaskThread $ WrappingRunnable.run(TaskThread.java:61)       在java.lang.Thread.run(Thread.java:745)

无法在数据库中映射此类关系? (Windows 10上的MySQL 5.7.10) 请求不能没有结构而反之亦然。 我该如何解决? 非常感谢你提前!

编辑1: 我现在收到了这个新错误:

  

org.hibernate.TransientPropertyValueException:object引用未保存的瞬态实例 - 在刷新之前保存瞬态实例: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,CONSTRAINT FKbi1rasm9sdgrouh2mdklvi2q   外键(id)参考structureaddress_id))

Structure具有另一个属性:Address,具有自己的Id和简单属性

@OneToOne @MapsId
private Address address;

但是,如果我检查JPA创建的表,我看到表结构有主键address_id ...为什么?

1 个答案:

答案 0 :(得分:1)

为什么注释高于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)。 在这里,您可以找到工作示例one to one example