У меня есть сущность, которая имеет многозначное сопоставление с другой сущностью.
Вот карта:
@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