2016-11-22 3 views
1

私は以下の問題を抱えています。私の例をGitHubにプッシュしました。 なぜ、すでに存在する場合、同じキーを持つ新しいエンティティをHibernateに挿入したいのですか?

私は私のクラスPlayerStatisticsのインスタンスを保持したい場合

は、Hibernateは、私はしたくない( @ManyToOneとして指定) Matchdayの既存のエンティティを作成しようとしますが、私はそれを回避していないようです。

initの方法では、DemoApplicationTestsのままです。

@Before 
public void init() { 
    final Matchday matchday = matchdayRepository.save(new Matchday(1)); 
    final Club club1 = clubRepository.save(new Club("Klub1")); 
    final Club club2 = clubRepository.save(new Club("Klub2")); 
    final Match match = matchRepository.save(new Match(matchday, club1, club2)); 
    final Player player = playerRepository.save(new Player(1, "Jan", "Kowalski", club1)); 
    playerStatisticsRepository.save(new PlayerStatistics(matchday, player, match)); 
} 

上記のような場合、次の例外が発生します。

org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [SYS_PK_10114]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement 
    at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:278) 
    at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:244) 
    at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:521) 
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:761) 
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:730) 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:504) 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:292) 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:133) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213) 
    at com.sun.proxy.$Proxy102.save(Unknown Source) 
    at com.example.DemoApplicationTests.init(DemoApplicationTests.java:49) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24) 
    at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75) 
    at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86) 
    at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:252) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:94) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) 
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) 
Caused by: org.hibernate.exception.ConstraintViolationException: could not execute statement 
    at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:59) 
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42) 
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:111) 
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:97) 
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:207) 
    at org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:45) 
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2934) 
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3434) 
    at org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:89) 
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:582) 
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:456) 
    at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:337) 
    at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:39) 
    at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1407) 
    at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:477) 
    at org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:3170) 
    at org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2384) 
    at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:467) 
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:146) 
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$100(JdbcResourceLocalTransactionCoordinatorImpl.java:38) 
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:220) 
    at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:68) 
    at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:517) 
    ... 44 more 
Caused by: java.sql.SQLIntegrityConstraintViolationException: integrity constraint violation: unique constraint or index violation; SYS_PK_10114 table: MATCHDAY 
    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source) 
    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source) 
    at org.hsqldb.jdbc.JDBCPreparedStatement.fetchResult(Unknown Source) 
    at org.hsqldb.jdbc.JDBCPreparedStatement.executeUpdate(Unknown Source) 
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:204) 
    ... 62 more 
Caused by: org.hsqldb.HsqlException: integrity constraint violation: unique constraint or index violation; SYS_PK_10114 table: MATCHDAY 
    at org.hsqldb.error.Error.error(Unknown Source) 
    at org.hsqldb.Constraint.getException(Unknown Source) 
    at org.hsqldb.index.IndexAVLMemory.insert(Unknown Source) 
    at org.hsqldb.persist.RowStoreAVL.indexRow(Unknown Source) 
    at org.hsqldb.TransactionManager2PL.addInsertAction(Unknown Source) 
    at org.hsqldb.Session.addInsertAction(Unknown Source) 
    at org.hsqldb.Table.insertSingleRow(Unknown Source) 
    at org.hsqldb.StatementDML.insertSingleRow(Unknown Source) 
    at org.hsqldb.StatementInsert.getResult(Unknown Source) 
    at org.hsqldb.StatementDMQL.execute(Unknown Source) 
    at org.hsqldb.Session.executeCompiledStatement(Unknown Source) 
    at org.hsqldb.Session.execute(Unknown Source) 
    ... 65 more 

私はHQLをデバッグする場合、私ははっきりHibernateは、それがすでに存在する場合でも、テーブルMatchdayに新しい行を挿入したいことがわかります。

Hibernate: 
    insert 
    into 
     Matchday 
     (matchdayNumber) 
    values 
     (?) 

私はinit()メソッドの最後の行をコメントした場合、問題はこの部分でなければならないので、それは、OK作品:私はここで何が問題をplayerStatisticsRepository.save(new PlayerStatistics(matchday, player, match))

@Before 
public void init() { 
    final Matchday matchday = matchdayRepository.save(new Matchday(1)); 
    final Club club1 = clubRepository.save(new Club("Klub1")); 
    final Club club2 = clubRepository.save(new Club("Klub2")); 
    final Match match = matchRepository.save(new Match(matchday, club1, club2)); 
    final Player player = playerRepository.save(new Player(1, "Jan", "Kowalski", club1)); 
    //playerStatisticsRepository.save(new PlayerStatistics(matchday, player, match)); 
} 

をやっていますか?

PlayerStatisticsクラスはそうです。

@Entity 
@IdClass(PlayerStatisticsId.class) 
public class PlayerStatistics implements Serializable { 
    //... 
    @Id 
    @ManyToOne(optional = false) 
    @PrimaryKeyJoinColumn 
    private Player player; 

    @Id 
    @ManyToOne(optional = false) 
    @PrimaryKeyJoinColumn 
    private Matchday matchday; 

    @ManyToOne(optional = false) 
    @JoinColumns({ @JoinColumn(name = "matchday_matchdaynumber", referencedColumnName = "matchday_matchdaynumber"), 
      @JoinColumn(name = "hometeam_name", referencedColumnName = "hometeam_name") }) 
    private Match match; 

    @Column(nullable = false) 
    private boolean playedFromTheFirstWhistleblow; 

    @Min(0) 
    @Column(nullable = false) 
    private int enteredTheFieldAtInSeconds; 

    @Min(0) 
    @Column(nullable = false) 
    private int leftTheFieldAtInSeconds; 

    @ElementCollection(fetch = FetchType.EAGER) 
    @CollectionTable 
    @MapKeyEnumerated(EnumType.STRING) 
    private Map<ScoreType, Integer> statistics = new HashMap<>(); 

    //... 
} 

EDIT

私は一方Playerエンティティから直接それを管理したい場合。次に、エンティティが既にセッションに関連付けられているとは限りませんが、例外が発生します。

@Before 
public void init() { 
    final Matchday matchday = matchdayRepository.save(new Matchday(1)); 
    final Club club1 = clubRepository.save(new Club("Klub1")); 
    final Club club2 = clubRepository.save(new Club("Klub2")); 
    final Match match = matchRepository.save(new Match(matchday, club1, club2)); 
    final Player player = new Player(1, "Jan", "Kowalski", club1); 
    player.addPlayerStatistics(new PlayerStatistics(matchday, player, match)); 
    playerRepository.save(player); 
} 
org.springframework.dao.DataIntegrityViolationException: A different object with the same identifier value was already associated with the session : [com.example.model.Player#1]; nested exception is javax.persistence.EntityExistsException: A different object with the same identifier value was already associated with the session : [com.example.model.Player#1] 
    at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:410) 
    at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:246) 
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:491) 
    at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:59) 
    at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:213) 
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:147) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:133) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213) 
    at com.sun.proxy.$Proxy99.save(Unknown Source) 
    at com.example.DemoApplicationTests.init(DemoApplicationTests.java:49) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24) 
    at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75) 
    at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86) 
    at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:252) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:94) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) 
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) 
Caused by: javax.persistence.EntityExistsException: A different object with the same identifier value was already associated with the session : [com.example.model.Player#1] 
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:116) 
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:155) 
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:162) 
    at org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:899) 
    at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:855) 
    at org.hibernate.engine.spi.CascadingActions$6.cascade(CascadingActions.java:261) 
    at org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:391) 
    at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:316) 
    at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:155) 
    at org.hibernate.engine.internal.Cascade.cascadeCollectionElements(Cascade.java:424) 
    at org.hibernate.engine.internal.Cascade.cascadeCollection(Cascade.java:356) 
    at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:319) 
    at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:155) 
    at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:104) 
    at org.hibernate.event.internal.AbstractSaveEventListener.cascadeAfterSave(AbstractSaveEventListener.java:445) 
    at org.hibernate.event.internal.DefaultMergeEventListener.entityIsTransient(DefaultMergeEventListener.java:238) 
    at org.hibernate.event.internal.DefaultMergeEventListener.entityIsDetached(DefaultMergeEventListener.java:300) 
    at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:169) 
    at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:68) 
    at org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:864) 
    at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:845) 
    at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:850) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:298) 
    at com.sun.proxy.$Proxy97.merge(Unknown Source) 
    at org.springframework.data.jpa.repository.support.SimpleJpaRepository.save(SimpleJpaRepository.java:509) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.executeMethodOn(RepositoryFactorySupport.java:503) 
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:488) 
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:460) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:61) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99) 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:282) 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136) 
    ... 37 more 
+0

http://stackoverflow.com/questions/3417097/jpa-difference-between-joincolumn-and-primarykeyjoincolumnは、あなたの選択が「@ Id」+「@ JoinColumn」または「@ PrimaryKeyJoinColumn」であることを示唆しているようです。しかし、あなたは '@ Id' +' @ PrimaryKeyJoinColumn'をやっています。私がHibernateを使用していた時、私は決して '@ IdClass'と複数の' @ Id 'を働かせることができませんでした。(私が推測した時のHibernateのバグ)、最も簡単な方法は常にサロゲートキー...:P –

+0

サロゲートキーは問題ありません。私は 'PrimaryJoinColumn'の内容を変更して動作が異なるかどうかを調べます。 – Jagger

+0

@AdrianShum Hmmm、 'ClassId'は問題のようです。私は今問題が全く違っているので、私は質問を更新します。 – Jagger

答えて

0

ここでの問題はPlayerStatisticsId、それが定義されていた方法でした。

元々、このように見えました。

public class PlayerStatisticsId implements Serializable { 
    //.. 
    private long player; 

    private int matchday; 

    public long getPlayer() { 
     return player; 
    } 

    public int getMatchday() { 
     return matchday; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (obj == this) { 
      return true; 
     } 
     if (obj instanceof PlayerStatisticsId) { 
      final PlayerStatisticsId o = (PlayerStatisticsId) obj; 
      return o.matchday == matchday && o.player == player; 
     } else { 
      return false; 
     } 
    } 
} 

私は私だけのプリミティブ/基本的なタイプが@ClassIdのために使用されるクラスで使用することができることをどこかで読んだ誓ったかもしれません。しかし、そうではないようです。

public class PlayerStatisticsId implements Serializable { 
    //... 

    private Player player; 

    private Matchday matchday; 

    public Player getPlayer() { 
     return player; 
    } 

    public Matchday getMatchday() { 
     return matchday; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (obj == this) { 
      return true; 
     } 
     if (obj instanceof PlayerStatisticsId) { 
      final PlayerStatisticsId o = (PlayerStatisticsId) obj; 
      return o.matchday.equals(matchday) && o.player.equals(player); 
     } else { 
      return false; 
     } 
    } 
} 

にそれを変更した後は動作するようには思えません。今はまったく異なる例外を受けていますが、それは別の質問の場合です。

関連する問題