Спящий режим запросов к полям, которых больше нет в таблице - PullRequest
1 голос
/ 16 июня 2011

У меня есть сущность, которая имеет многозначное сопоставление с другой сущностью. Вот карта:

@JoinColumn(name = "user_id", referencedColumnName = "id")
 @ManyToOne 
private User user;

У пользователя объекта (и таблицы) у меня было поле с именем AuthorId. Я удалил это поле из таблицы и объекта. Теперь, когда я использую find() для объекта, Hibernate генерирует запрос, включающий старые поля и не включающий новые поля, которые я добавил в таблицу (и сопоставил в объекте).

Обратите внимание, что это происходит не всегда, большую часть времени запрос выполняется нормально, но время от времени я получаю исключение MySQLSyntaxErrorException: Unknown column.

Не могу найти причину для этого, есть идеи?

находка, которую я использую, - это find(Long id) из JPA: entry = auditLogDAO.find(id);

Код объекта User:

@Entity
@Table(name = "users")
public class User implements Serializable{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name="id",unique=true, nullable=false )
    @GeneratedValue( strategy = IDENTITY )
    private Long id;

    @Column(name ="username",unique=true, nullable=false)
    @Field(index = Index.TOKENIZED, store = Store.NO)
    private String username;

    @Column
    private String password;

    @Column
    private int enabled;

    @OneToOne
    @JoinColumn(name = "current_account", referencedColumnName = "id")
    private Account currentAccount;

    @OneToOne
    @JoinColumn(name = "original_account", referencedColumnName = "id")
    private Account originalAccount;

    @OneToMany
    @JoinColumn(name = "user_id", referencedColumnName = "id")
    private List<Authority> authorities;

    @Column(name="first_name")
    @Field(index = Index.TOKENIZED, store = Store.NO)
    private String firstName;

    @Column(name="last_name")
    @Field(index = Index.TOKENIZED, store = Store.NO)
    private String lastName;

    @Column(name="email",unique=true, nullable=false )
    @Field(index = Index.TOKENIZED, store = Store.NO)
    private String email;

    @Column(name="switch_allowed")
    private Boolean switchAllowed;

    @Lob
    @Column(name = "additional_emails")
    private String additionalEmails;

Таблица полномочий:

@Entity
@Table(name = "authorities")
public class Authority implements Serializable{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "id")
    @GeneratedValue( strategy = IDENTITY )
    private Long id;

    @Column(name = "user_id")
    private Long userId;

    @Column(name = "authority")
    private String authority;

Полная трассировка стека (если вы видите, в запросе, сгенерированном hibernate, есть user6_.authority_id, столбец, который больше не существует в отображении):

org.springframework.dao.InvalidDataAccessResourceUsageException: не удалось загрузить объект: [Com.legolas.model.AuditLog # 3048]; SQL [выберите audlog0_.id как id26_8_, audlog0_.account_id as account8_26_8_, auditlog0_.date as date26_8_, auditlog0_.domain_object_id как домен3_26_8_, auditlog0_.event_type as event4_26_8_, Auditlog0_.Notify как уведомлено26_8_, audlog0_.object_type as object6_26_8_, auditlog0_.object_xml как object7_26_8_, auditlog0_.user_id как user9_26_8_, account1_.id как id7_0_, account1_.account_type as account2_7_0_, account1_.name as name7_0_, account1_1_.adserver_id as adserver3_8_0_, account1_1_.stamping_method as stamping1_8_0_, account1_3_.advertiser_id as advertiser2_30_0_, account1_4_.brand_id as brand2_54_0_, account1_5_.in_use as in1_58_0_, account1_5_.order_by как order2_58_0_, account1_6_.agency_id as agency2_60_0_, случай, когда account1_1_.account_id не является нулевым затем 1, когда account1_2_.account_id равен не ноль, то 2, когда account1_3_.account_id не является нулевым затем 3, когда account1_4_.account_id равен не ноль, тогда 4, когда account1_5_.account_id не является нулевым затем 5, когда account1_6_.account_id равен не равно нулю 6, когда account1_.id не ноль, тогда 0 заканчивается как clazz_0_, adserver2_.id as id0_1_, adserver2_.name как name0_1_, случай, когда adserver2_1_.adserver_id не является нулевым тогда 1, когда adserver2_2_.adserver_id не равно нулю 2, когда adserver2_.id не равно нулю, то 0 заканчивается как clazz_1_, advertiser3_.account_id as id7_2_, advertiser3_1_.account_type as account2_7_2_, рекламодатель3_1_.name как name7_2_, рекламодатель3_.agency_id как agency2_60_2_, brand4_.account_id as id7_3_, brand4_1_.account_type as account2_7_3_, brand4_1_.name as name7_3_, brand4_.advertiser_id as рекламодатель2_30_3_, agency5_.account_id как id7_4_, agency5_1_.account_type как account2_7_4_, agency5_1_.name as name7_4_, user6_.id как id6_5_, user6_.additional_emails как дополнительный2_6_5_, user6_.authority_id как author10_6_5_, user6_.email как email6_5_, user6_.enabled as enabled6_5_, user6_.first_name as first5_6_5_, user6_.last_name as last6_6_5_, user6_.original_authority как original11_6_5_, user6_.password как пароль 6_5_, user6_.switch_allowed как switch8_6_5_, user6_.username as username6_5_, author7_.id as id5_6_, author7_.account_id as account2_5_6_, author7_.authority как авторитет 5_6_, авторитет 7_ имя пользователя как username5_6_, author8_.id как id5_7_, author8_.account_id as account2_5_7_, authority8_.authority как авторитет 5_7, авторитет 8_имя пользователя как username5_7_ из audit_log auditlog0_ оставил внешние учетные записи account1_ on auditlog0_.account_id = account1_.id оставил внешнее присоединение к издателю account1_1_ on account1_.id = account1_1_.account_id оставил внешнее объединение агентств account1_2_ on account1_.id = account1_2_.account_id оставил внешнее объединение брендов account1_3_ на account1_.id = account1_3_.account_idосталось внешнее объединение продуктов account1_4_ on account1_.id = account1_4_.account_id левое внешнее соединение data_vendors account1_5_ on account1_.id = account1_5_.account_id оставил внешнее объединение рекламодателей account1_6_ on account1_.id = account1_6_.account_id левые внешние соединения adservers2 на account1_1_.adserver_id = adserver2_.id левое внешнее соединение ad_server_agency adserver2_1_ включен adserver2_.id = adserver2_1_.adserver_id левое внешнее соединение ad_server_publisher adserver2_2_ включен adserver2_.id = adserver2_2_.adserver_id оставил внешнее объединение рекламодателей рекламодатель3_ на account1_3_.advertiser_id = advertiser3_.account_id оставленные внешние учетные записи рекламодатель3_1_ на advertiser3_.account_id = advertiser3_1_.id оставил внешнее объединение брендов brand4_ on account1_4_.brand_id = brand4_.account_id оставил внешние учетные записи brand4_1_ на brand4_.account_id = brand4_1_.id осталось агенства внешних объединений account1_6_.agency_id = agency5_.account_id оставило внешнее объединение учетных записей agency5_1_ на agency5_.account_id = agency5_1_.id осталось пользователи внешнего соединения user6_ on audlog0_.user_id = user6_.id осталось полномочия внешнего объединения7_ на user6_.authority_id = authority7_.id левые сторонние власти авторитет 8_ на user6_.original_authority = authority8_.id где auditlog0_.id =?]; вложенными исключение org.hibernate.exception.SQLGrammarException: не удалось загрузить объект: [com.legolas.model.AuditLog # 3048] в org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException (SessionFactoryUtils.java:629) в org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible (HibernateJpaDialect.java:100) в org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible (AbstractEntityManagerFactoryBean.java:368) в org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible (ChainedPersistenceExceptionTranslator.java:58) в org.springframework.dao.support.DataAccessUtils.translateIfNecessary (DataAccessUtils.java:213) в org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke (PersistenceExceptionTranslationInterceptor.java:163) в org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:172) в org.springframework.transaction.interceptor.TransactionInterceptor.invoke (TransactionInterceptor.java:110) в org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:172) в org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke (ExposeInvocationInterceptor.java:89) в org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:172) в org.springframework.aop.framework.JdkDynamicAopProxy.invoke (JdkDynamicAopProxy.java:202) на $ Proxy317.find (неизвестный источник) на com.legolas.notifications.jobs.NotificationJob.asapNotification (NotificationJob.java:133) в sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Метод) в sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:57) в sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) в java.lang.reflect.Method.invoke (Method.java:616) в org.springframework.util.MethodInvoker.invoke (MethodInvoker.java:273) в org.springframework.scheduling.support.MethodInvokingRunnable.run (MethodInvokingRunnable.java:65) в org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run (DelegatingErrorHandlingRunnable.java:51) в java.util.concurrent.Executors $ RunnableAdapter.call (Executors.java:471) в java.util.concurrent.FutureTask $ Sync.innerRunAndReset (FutureTask.java:351) в java.util.concurrent.FutureTask.runAndReset (FutureTask.java:178) вjava.util.concurrent..java: 1110) в java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:603) в java.lang.Thread.run (Thread.java:636). Причина: org.hibernate.exception.SQLGrammarException:не удалось загрузить объект: [com.legolas.model.AuditLog # 3048] в org.hibernate.exception.SQLStateConverter.convert (SQLStateConverter.java:92) в org.hibernate.exception.JDBCExceptionHelper.convert (JDBCExceptionHelper.java:66) в org.hibernate.loader.Loader.loadEntity (Loader.java:1957) в org.hibernate.loader.entity.AbstractEntityLoader.load (AbstractEntityLoader.java:86) в org.hibernate.loader.entity.AbstractEntityLoader.load (AbstractEntityLoader.java:76) at org.hibernate.persister.entity.AbstractEntityPersister.load (AbstractEntityPersister.java:3270) в org.hibernate.event.def.DefaultLoadEventListener.loadFromDatasource (DefaultLoadEventListener.java:496) в org.hibernate.event.def.DefaultLoadEventLavaEo.LoF.hibernate.event.def.DefaultLoadEventListener.load (DefaultLoadEventListener.java:227) в org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad (DefaultLoadEventListener.java:285) по умолчанию..java: 152) в org.hibernate.impl.SessionImpl.fireLoad (SessionImpl.java:1080) в org.hibernate.impl.SessionImpl.get (SessionImpl.java:997) в org.hibernate.impl.SessionImpl.get (SessionImpl.java:990) в org.hibernate.ejb.AbstractEntityManagerImpl.find (AbstractEntityManagerImpl.java:554) в org.hibernate.ejb.AbstractEntityManagerImpl.find (AbstractEntityManagerImplhota.No.No.j.jp.jlj.jpj.jlj.jpj.jpj.jpj.jlj.jlj.jp.Метод) в sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:57) в sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) в java.lang.reflect.Method.invoke (Method.java:6f.rapa.rapa.rapa.rapa.rapa.rapa.rapa.rapa.rapa.rapa.rapa.rapa.rapa.rapa.rapa.rapa.rapa.rapa.rapa.rapa.rapa.rag.rag.rag.rag.rag.jp.SharedEntityManagerCreator $ SharedEntityManagerInvocationHandler.invoke (SharedEntityManagerCreator.java:240) по адресу $ Proxy236.find (неизвестный источник) по адресу com.legolas.dao.GenericDAOWithJPA.find (GenericDAOWithJhoti.hore.jor.jp)at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) в java.lang.hoj.jjspringframework.aop.support.iveMethodInvocation.java:150) в org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke (PersistenceExceptionTranslationInterceptor.java:155) ... еще 23.author_id 'в' списке полей 'в sun.reflect.NativeConstructorAccessorImpl.newInstance0 (собственный метод) в sun.reflect.NativeConstructorAccessorImpl.newInstance (NativeConstructorAccessorImpl.java:57) в sun.reflect.DelegatingConmpj.java.lang.reflect.Constructor.newInstance (Constructor.java:532) в com.mysql.jdbc.Util.handleNewInstance (Util.java:406) вcom.mysql.jdbc.Util.getInstance (Util.java:381) в com.mysql.jdbc.SQLError.createSQLException (SQLError.java:1030) в com.mysql.jdbc.SQLError.createSQLException (SQLError.java:956) в com.mysql.jdbc.MysqlIO.checkErrorPacket (MysqlIO.java:3491) в com.mysql.jdbc.MysqlIO.checkErrorPacket (MysqlIO.java:3423) в com.mysql.jdbc.MysqlIO.sendCommand (MysqlIO.java:1936) в com.mysql.jdbc.MysqlIO.sqlQueryDirect (MysqlIO.java:2060) в com.mysql.jdbc.ConnectionImpl.execSQL (ConnectionImpl.java:2542) в com.mysql.jdbc.PreparedStatement.executeInternal (PreparedStatement.java:1734) в com.mysql.jdbc.PreparedStatement.executeQuery (PreparedStatement.java:1885) в org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery (DelegatingPreparedStatement.java:93) в org.hibernate.jdbc.AbstractBatcher.getResultSet (AbstractBatcher.java:208) в org.hibernate.loader.Loader.getResultSet (Loader.java:1869) в org.hibernate.loader.Loader.doQuery (Loader.java:718) в org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections (Loader.java:270) в org.hibernate.loader.Loader.loadEntity (Loader.java:1953) ... еще 51

Ответы [ 2 ]

1 голос
/ 22 августа 2013

У меня была та же проблема: я удалил столбец из одной из таблиц базы данных, изменил весь код Java / Hibernate, чтобы он больше не ссылался на этот столбец, но все еще получал эту ошибку во время выполнения.

В моем случае проблема была связана с зависимым проектом.То есть код Java находился в отдельном проекте, от которого зависел мой основной проект.Чтобы заставить Eclipse и Tomcat признать изменения в зависимом проекте, я сделал две вещи в основном проекте.

  1. Свойства |Путь сборки Java |Проекты.Удалить зависимый проект.Закройте диалоговое окно.Вернуться к Свойствам |Путь сборки Java |Проекты и повторно добавьте зависимый проект.

  2. Свойства |Развертывание Ассамблеи |Проекты.Удалить зависимый проект.Закройте диалоговое окно.Вернуться к Свойствам |Сборка |Проекты и повторно добавьте зависимый проект.

Затем перезапустите сервер Tomcat.

1 голос
/ 16 июня 2011

Я подозреваю, что у вас все еще есть сопоставление ваших прав доступа (таблицы прав доступа), которые связаны с вашим пользователем.Скорее всего, это будет сопоставлено с author_id, вызывающим вашу проблемуЛибо исправьте сопоставление Authority, либо удалите его полностью.Если это не так, у вас возникнет проблема с загрузкой классов при загрузке более старой версии вашей модели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...