2016-01-10 4 views
0

Я работаю над проектом для своего университета. Это система бронирования, такая как 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, CONSTRAINT FKbi1rasm9sdgrouh2mdklvi2q FOREIGN KEY (id) Лит structure (address_id))

Структура имеет еще один атрибут: адрес, со своим собственным Id и простые атрибуты

@OneToOne @MapsId 
private Address address; 

Но если проверить таблицы, созданные с помощью JPA я вижу что структура таблицы имеет в качестве первичного ключа address_id ... почему?

+0

em.persist (Request) сохранит структуру, если включен каскад. Если нет, вы вызываете em.persist (Request) и em.persist (Structure) ... точно так же, как в учебниках JPA –

+0

Да, вы правы! И я также должен включить каскад для адреса. Но address_id по-прежнему является основным ключом структуры ... – TheNobleSix

+0

Я сделал это! Я удалил '@ JoinColumn', как сказал Сергей, и' @ MapsId' из адреса. Также я добавил внутри конструктора Request the line: structure.setRequest (this). Теперь все работает отлично! – TheNobleSix

ответ

1

Почему аннотация выше getRequest()?Попробуйте сделать это

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


public Request getRequest() { 
return request; 

}

ли вы пытаетесь удалить эту аннотацию @JoinColumn ( имя = "structure_id", уникальный = истина, обнуляемым = ложь, обновляемым = ложь). Здесь вы можете найти пример работы one to one example

+0

Я скопировал пример документации (что вы можете найти с помощью Ctrl + Q в комментариях @OneToOne внутри IntelliJ IDEA 15) – TheNobleSix

+0

Я попытался, и результат следующий: 'org.hibernate.AnnotationException: ссылочное свойство не a (One | Many) ToOne: it.ispw.efco.nottitranquille.model.Request.structure в mappedBy из it.ispw.efco.nottitranquille.model.Structure.request' – TheNobleSix

+0

в JPA вы можете аннотировать поле ИЛИ свойство (getter), так что это не является проблемой –

Смежные вопросы