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

当我运行 unit/integration test 时,问题就开始了MyDomainDaoTest。我想doSomething()测试MyDomainDao. 为了做到这一点,我需要在数据库中测试五行(我在内存中使用 HSQLDB),因此方法中的循环setupListOfMyDomain()。循环的奇怪之处在于我在第二次迭代中得到了这个错误:

错误 JDBCExceptionReporter - 完整性约束违规:唯一约束或索引违规;SYS_CT_10231 表:我的域 

它没有比这更神秘的了。我知道在第一次迭代时会生成一个 ID。如果我试图持久化另一个对象,为什么会在后续迭代中违反完整性约束?

4

1 回答 1

1

我认为你的映射有问题。您正在声明和之间的一对一关系MyDomainAnotherDomain但在您的单元测试中,这 5 个实例MyDomain共享同一个实例,AnotherDomain因此您应该使用多对一关系。

于 2013-02-19T13:40:26.300 回答