Reputation: 103
I'm working on a project for my University. It's a booking system like 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()
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.createEntityManagerFactory(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.internalDoFilter(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) at 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)
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. How can I solve it? Thank you very much in advance!
EDIT 1: I got this new error now:
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
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:
The previous problem is solved by adding (cascade = CascadeType.ALL)
on the @OneToOne on Request.structure
But now I got this:
Cannot add or update a child row: a foreign key constraint fails (
notti_tranquille
.request
, CONSTRAINTFKbi1rasm9sdgrouh2mdklvi2q
FOREIGN KEY (id
) REFERENCESstructure
(address_id
))
Structure has another attribute: Address, with its own Id and simple attributes
@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?
Upvotes: 0
Views: 290
Reputation: 56
Why is annotation above 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) . Here you can find work example one to one example
Upvotes: 1