Spring = 3.2.3.RELEASE および Hibernate-annotations = 3.5.6-Final を使用しています
私は豆を持っています:
@Entity
public class Step implements Serializable, Comparable<Step> {
private static final long serialVersionUID = -5345848109844492261L;
@Id
@GeneratedValue
private Integer id;
@Column
private String description;
@Column(nullable = false)
private boolean active;
@Column(nullable = false)
private int stepOrder;
@Column(nullable = false)
private String command;
@ManyToOne
@JoinColumn(name = "elementID")
private Element element;
@Column
private String arg1;
@Column
private String arg2;
@ManyToOne
@JoinColumn(name = "testCaseID", nullable = false)
private TestCase testCase;
@ManyToOne
@JoinColumn(name = "releaseID", nullable = false)
private ReleaseEntity releaseEntity;
@ManyToOne
@JoinColumn(name = "updatedBy", nullable = false)
private User updatedBy;
@Temporal(TemporalType.TIMESTAMP)
@Column(columnDefinition = "timestamp", insertable = false, updatable = false)
@Generated(GenerationTime.ALWAYS)
private Date updatedDate;
@Column(nullable = false)
private boolean deleted;
.....
getters/ setters , equals / hashCode
そして、私はこのエンティティを永続化するためのdaoを持っています:
@Repository("StepDAO")
@Transactional
public class StepDAOMysql extends BaseDAOMysql implements StepDAO
{
@Override
public void delete(Step step)
{
if (hasHistory(step))
{
List<?> listToDelete = hibernateTemplate.find(
"from StepHistory st where st.step=?", step);
hibernateTemplate.deleteAll(listToDelete);
}
hibernateTemplate.evict(step);
hibernateTemplate.delete(step);
}
@Override
@Transactional(readOnly = true)
public boolean hasHistory(Step step)
{
return !CollectionUtils.isEmpty(hibernateTemplate.find(
"from StepHistory st where st.step=?", step));
}
DAO の削除を実行しようとすると、
org.springframework.dao.DuplicateKeyException: a different object with the same identifier value was already associated with the session: [com.livenation.automation.bean.Step#1]; nested exception is org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [com.livenation.automation.bean.Step#1]
実際、私は混乱しました。重複した例外について多くのことをグーグルで検索し、すべての投稿は saveOrUpdate 中の重複した例外に関するものですが、削除時に誰もそれに直面していません。しかし、とにかく私は提案された解決策を挿入します - エビクト方法と助けにはなりませんでした。おそらく、休止状態と春の間の例外のマッピングに何らかのバグがありますか? (私は以前に他のプロジェクトでそのような問題を見ました)
EDIT :テスト コンテキストでのこのメソッドの実行のみに関連する問題のようです。本番環境で実行しても例外は発生しません。テスト コードは非常に単純です。
@Test
public void canDeleteStepWithHistory()
{
linkedStep.setArg1(getRandomString());
dao.saveOrUpdate(linkedStep); // in line above we change value of linkedStep , DAO will detect this and will create appropriate StepHistory object that linked with linkedStep . This is main goal ofg test check that DAO can delete such object
dao.delete(linkedStep);
Step fromDB = dao.getById(linkedStep.getId());
Assertions.assertThat(fromDB).isNull();
}
テストは @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("/test-dispatcher.xml") を使用して実行されます