【发布时间】:2013-10-17 07:18:45
【问题描述】:
这是我的示例测试用例,其中 A 与 B 具有一对多关系。现在我将 B 的实例添加到 Bs A 的列表中,并对 A 的实例执行 SaveOrUpdate 但测试用例在以下情况下失败回滚为真,因为未生成 B 实例的 ID。 当 Rollback 为 false 时它会通过,但随后也会将一个条目添加到数据库中。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
@WebAppConfiguration
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class,
TransactionalTestExecutionListener.class,DbUnitTestExecutionListener.class})
@TransactionConfiguration(transactionManager="transactionManager",defaultRollback=true)
@Transactional(propagation=Propagation.REQUIRED)
public class Test1 {
@Autowired
DummyDao dummyDao;
@Test
// @Rollback(false)
public void newTest2(){
// A temp=dummyDao.getAById(new Long(1));
A temp=dummyDao.getAs().get(0);
Hibernate.initialize(temp.getBs());
B class2=new B();
temp.getBs().add(class2);
dummyDao.saveA(temp);
assertNotNull(class2.getId());
}
}
A类详情
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
import org.hibernate.annotations.IndexColumn;
@Table(name="UJJWAL_DUMMY", schema="dbo")
@Entity
public class A {
@Id
@Column
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
@Column
private String prop;
@OneToMany(fetch=FetchType.LAZY)
@Cascade({CascadeType.ALL})
@JoinColumn(name="fk_A")
@IndexColumn(name="idx")
private List<B> Bs;
// Setter and getters
}
B类详情 @实体 公共类 B {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column
private Long id;
@Column
private String dummyColumn2;
// Setters and Getters
}
【问题讨论】:
-
我很好奇:你为什么打电话给
Hibernate.initialize()? -
测试乍一看似乎是正确的。回滚对为实例生成 ID 没有影响。请出示
A和B的相关部分。 -
@Aaron Digulla 我使用了 Hibernate.initialize() 因为关系是惰性的,并且在启用回滚时为 temp(A 的实例)而不是为 class2(B 的实例)生成 id。
-
抱歉,看不出有什么问题。我希望上面的代码可以工作:-/