このサイトに参加できてとてもうれしいです。私はスタックオーバーフローの初心者ですが、常に初めてです:)。
現時点では、Spring Data 1.3.0 と Hibernate 4.1.9 を使用しており、リポジトリに基づいてクエリを生成するために Java で JPA 2.0 を使用しています。データベースは SQL Server 2008 です。次の 2 つのテーブルで挿入操作を行う必要があります。 PATTERN_TABLE という名前のパターン テーブル。このテーブルは別の CHILD_TABLE から参照され、それらの関係は 1 対多です。この要件のソリューションを開発するための私のガイドは、次のリンクです: Hibernate one-to-man mapping using annotations、そしてこれを春のデータサポート(リポジトリ管理)に適応させようとしています。ただし、挿入のために Hibernate が CHILD_TABLE テーブル (データベース内) にもマッピングエンティティにも存在しない列を見つけようとするため、失敗します。Hibernate がこの列名を見つけようとする理由はわかりませんが、これは別名 (patternTable_CODIGO と呼ばれます) であると思います。エラーは、次のログ レジストリによって定義されます。
Hibernate: insert into GDA.dbo.PATTERN_TABLE (COLUMN_A, COLUMN_B, COLUMN_C, COLUMN_D) values (?, ?, ?, ?)
(...)
Hibernate: insert into GDA.dbo.CHILD_TABLE (COLUMN_CHILD_A, COLUMN_CHILD_B, patternTable_CODIGO) values (?, ?, ?) --->patternTable_CODIGO doesn't exists in the database!!!
2013-09-19 18:05:12,967 [Thread-18] [SqlExceptionHelper:logExceptions] WARN SQL Error: 207, SQLState: 42S22
2013-09-19 18:05:12,967 [Thread-18] [SqlExceptionHelper:logExceptions] ERROR [FMWGEN][SQLServer JDBC Driver][SQLServer]Invalid column name 'patternTable_CODIGO'.
2013-09-19 18:05:12,967 [Thread-18] [SqlExceptionHelper:logExceptions] WARN SQL Error: 8180, SQLState: HY000
2013-09-19 18:05:12,968 [Thread-18] [SqlExceptionHelper:logExceptions] ERROR [FMWGEN] [SQLServer JDBC Driver][SQLServer]Statement(s) could not be prepared.
org.springframework.dao.InvalidDataAccessResourceUsageException: [FMWGEN][SQLServer JDBC Driver][SQLServer]Invalid column name 'patternTable_CODIGO'.;
SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: [FMWGEN][SQLServer JDBC Driver][SQLServer]Invalid column name 'patternTable_CODIGO'.
at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:635)
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:106)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:403)
(...)
at sun.proxy.$Proxy274.save(Unknown Source)
at co.com.myproject.impl.PatternTableServiceImpl.guardar(PatternTableServiceImpl.java:25)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
(...)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
at sun.proxy.$Proxy275.guardar(Unknown Source)
at co.com.myproject.principal.GenerarPlano.inicio(GenerarPlano.java:102)
Caused by: org.hibernate.exception.SQLGrammarException: [FMWGEN][SQLServer JDBC Driver][SQLServer]Invalid column name 'patternTable_CODIGO'.
at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:82)
at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110)
at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:129)
at org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke(AbstractProxyHandler.java:81)
at sun.proxy.$Proxy264.executeUpdate(Unknown Source)
at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:96)
at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:58)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2936)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3447)
at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:81)
at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:362)
at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:203)
at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:183)
at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:167)
at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:320)
at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:287)
at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:193)
at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:126)
at org.hibernate.ejb.event.EJB3MergeEventListener.saveWithGeneratedId(EJB3MergeEventListener.java:71)
at org.hibernate.event.internal.DefaultMergeEventListener.saveTransientEntity(DefaultMergeEventListener.java:236)
at org.hibernate.event.internal.DefaultMergeEventListener.entityIsTransient(DefaultMergeEventListener.java:216)
at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:154)
at org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:913)
at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:895)
at org.hibernate.engine.spi.CascadingAction$6.cascade(CascadingAction.java:288)
at org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:383)
at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:326)
at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:208)
at org.hibernate.engine.internal.Cascade.cascadeCollectionElements(Cascade.java:412)
at org.hibernate.engine.internal.Cascade.cascadeCollection(Cascade.java:353)
at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:329)
at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:208)
at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:165)
at org.hibernate.event.internal.AbstractSaveEventListener.cascadeAfterSave(AbstractSaveEventListener.java:448)
at org.hibernate.event.internal.DefaultMergeEventListener.entityIsTransient(DefaultMergeEventListener.java:220)
at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:154)
at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:76)
at org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:903)
at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:887)
at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:891)
at org.hibernate.ejb.AbstractEntityManagerImpl.merge(AbstractEntityManagerImpl.java:879)
at sun.reflect.GeneratedMethodAccessor280.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:241)
at sun.proxy.$Proxy256.merge(Unknown Source)
at org.springframework.data.jpa.repository.support.SimpleJpaRepository.save(SimpleJpaRepository.java:353)
at sun.reflect.GeneratedMethodAccessor278.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.executeMethodOn(RepositoryFactorySupport.java:333)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:318)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:96)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:260)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:155)
... 33 more
これはPatternTable
エンティティです:
package co.com.myproject.persistencia;
// ... libraries
import javax.persistence.*;
@Entity
@Table(name = "PATTERN_TABLE", schema = "dbo", catalog = "GDA")
public class PatternTable implements Serializable {
private static final long serialVersionUID = 1L;
private int codigo;
// ... a lot of mapped fields...
private Set<ChildTable> childTable = new HashSet<ChildTable>(0);
public PatternTable() {}
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "CODIGO")
public int getCodigo() {
return codigo;
}
public void setCodigo(int codigo) {
this.codigo = codigo;
}
// ... a lot of getters and setters...
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name="CODIGO_PATTERN_TABLE")
public Set<ChildTable> getChildTable() {
return childTable;
}
public void setChildTable(Set<ChildTable> childTable) {
this.childTable = childTable;
}
}
これがChildTable
実体
package co.com.myproject.persistencia;
//... libs
@Entity
@Table(name = "CHILD_TABLE", schema = "dbo", catalog = "GDA")
public class ChildTable implements java.io.Serializable {
private static final long serialVersionUID = 1L;
private int codigo;
private PatternTable patternTable;
//... more attribures
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "CODIGO", unique = true, nullable = false)
public int getCodigo() {
return codigo;
}
public void setCodigo(int codigo) {
this.codigo = codigo;
}
@ManyToOne
public PatternTable getPatternTable() {
return patternTable;
}
public void setPatternTable(PatternTable patternTable) {
this.patternTable = patternTable;
}
// ... more getters and setters
}
これは私のリポジトリインターフェースですPatternTable
:
@Transactional(readOnly = true)
public interface PatternTableRepository extends JpaRepository<PatternTable, Integer> {
List<PatternTable> findByPatternParameter(String patternParameter);
// ... more code next
}
私のサービスメソッドは次のように定義されています:
public void guardar(PatternTable patternTable) {
patternTableRepository.save(patternTable);
}
のpatternTable
オブジェクトは、次の方法で 1 つ以上を収集childTable
します。
childTable = new ChildTable();
//...set attributes of childTable...
patternTable.getChildTable().add(childTable);
私の英語が流暢でない場合は申し訳ありません。解決策を見つけようとしますが、ご協力いただければ幸いです。どうもありがとうございました!:)