Я работаю над проектом для своего университета. Это система бронирования, такая как AirBnb. Внутри системы есть два объекта: запрос и структура. Структура не может быть вставлена без соответствующего запроса. Таким образом, я смоделировал запрос следующим образом:@OneToOne отношения с JPA
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, за столом: Запрос, для столбцов: [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) на 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) на 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 (каталогизированы AO.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) в 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) at 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) 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:66 8) на 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) на java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:615) на org.apache.tomcat.util.threads. TaskThread $ WrappingRunnable.run (TaskThread.java:61) в java.lang.Thread.run (Thread.java:745)
Это не может отображать такие отношения внутри БД? (MySQL 5.7.10 на Windows 10) Запрос не может жить без Структуры и наоборот. Как я могу это решить? Большое вам спасибо!
EDIT 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);
EDIT 2:
Предыдущая задача решается путем добавления (cascade = CascadeType.ALL)
на @OneToOne на Request.structure
Но теперь я получил это:
Невозможно добавить или обновить детский ряд: ограничение внешнего ключа завершается (
notti_tranquille
.request
, CONSTRAINTFKbi1rasm9sdgrouh2mdklvi2q
FOREIGN KEY (id
) Литstructure
(address_id
))
Структура имеет еще один атрибут: адрес, со своим собственным Id и простые атрибуты
@OneToOne @MapsId
private Address address;
Но если проверить таблицы, созданные с помощью JPA я вижу что структура таблицы имеет в качестве первичного ключа address_id ... почему?
em.persist (Request) сохранит структуру, если включен каскад. Если нет, вы вызываете em.persist (Request) и em.persist (Structure) ... точно так же, как в учебниках JPA –
Да, вы правы! И я также должен включить каскад для адреса. Но address_id по-прежнему является основным ключом структуры ... – TheNobleSix
Я сделал это! Я удалил '@ JoinColumn', как сказал Сергей, и' @ MapsId' из адреса. Также я добавил внутри конструктора Request the line: structure.setRequest (this). Теперь все работает отлично! – TheNobleSix