0

次のクラスを検討してください。

@Entity
public class MyDomain{

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @OneToOne
    private AnotherDomain anotherDomain;

    //getters and setters here
}

@Repository
public MyDomainDao extends DaoBase<MyDomain>{

    public List<MyDomain> doSomething(AnotherDomain parameter){
        //code does something here
    }

}

public class DaoBase<I>{

    @Autowired
    private SessionFactory sessionFactory;

    public void save(I object){
        sessionFactory.getCurrentSession().saveOrUpdate(object);
    }
}

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:context.xml"})
@Transactional(propagation = Propagation.REQUIRED)
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)
public class MyDomainDaoTest {

    @Autowired
    private MyDomainDao dao;    

    @Mock
    private AnotherDomain anotherDomain;

    @Before
    public void setUp() {
        this.setupListOfMyDomain();
    }

    @Test
    public void testDoSomething(){
        //test the method here
    }

    private void setupListOfMyDomain(){
        MyDomain domain = null;     

        //five rows of MyDomain
        for(int i=0; i<=4; i++){
            domain = new MyDomain();
            domain.setAnotherDomain(anotherDomain);
            dao.save(domain);
        }       
    }
}

要約すると、私は単純なエンティティクラス( )とスーパークラスから拡張されMyDomainたドメインdao( )を持っています。永続性のセッションが呼び出されるのはこのスーパークラスであり、エンティティクラスを保存/更新/削除するのもこのスーパークラスの責任です。継承により、サブクラスは子固有のメソッドを定義するだけで済みます。MyDomainDaoDaoBase

ユニット/統合テストを実行すると、問題が発生しますMyDomainDaoTestdoSomething()で定義されているメソッドをテストしたかったのMyDomainDaoです。これを行うには、データベース内の5つのテスト行(メモリ内でHSQLDBを使用しています)、つまりメソッド内のループを実行する必要がありますsetupListOfMyDomain()。ループの奇妙な点は、2回目の反復でこのエラーが発生することです。

エラーJDBCExceptionReporter-整合性制約違反:一意性制約またはインデックス違反。SYS_CT_10231テーブル:MyDomain 

それ以上の謎めいたものを手に入れることはできません。IDが最初の反復で生成されることを知っています。別のオブジェクトを永続化しようとすると、後続の反復で整合性制約違反が発生するのはなぜですか?

4

1 に答える 1

1

マッピングに問題があると思います。との間の1対1の関係を宣言してMyDomainAnotherDomainますが、単体テストでは、の5つのインスタンスがMyDomain同じインスタンスを共有しているAnotherDomainため、代わりに多対1の関係を使用する必要があります。

于 2013-02-19T13:40:26.300 に答える