我正在JUnit4中测试我的存储库。我需要检查我的update()
方法,但是当我从存储库获取更新实体时,我的分离的旧实体也会更新。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:testContext.xml" })
@Transactional
@FixMethodOrder(MethodSorters.JVM)
public class RepositoryTestTemplate extends
AbstractTransactionalJUnit4SpringContextTests {
}
public class CreditCardRepositoryTest extends RepositoryTestTemplate {
@Autowired
CreditCardRepository creditCardRepository;
@Test
public void updateTest() {
CreditCard creditCard = new CreditCard();
String oldNumber = "123456789123";
String newNumber = "321123456789";
creditCard.setCardNumber(oldNumber);
creditCardRepository.save(creditCard);
CreditCard creditCardToUpdate = creditCardRepository.find(creditCard.getId());
creditCardToUpdate.setCardNumber(newNumber);
creditCardRepository.update(creditCardToUpdate);
CreditCard updatedCreditCard = creditCardRepository.find(creditCard.getId());
assertNotNull(updatedCreditCard);
assertEquals(newNumber, updatedCreditCard.getCardNumber());
assertEquals(newNumber, creditCard.getCardNumber());//This should not be equals and cause Error, but it doesn't!!!
//It looks like it returns updated value.
}
}
这是我的存储库
@Repository
public class JpaCreditCardRepository implements CreditCardRepository {
@PersistenceContext
EntityManager em;
@Override
@Transactional
public void save(CreditCard creditCard) {
em.persist(creditCard);
}
@Override
@Transactional
public void update(CreditCard creditCard) {
em.merge(creditCard);
}
}
Enity
@Entity
public class CreditCard {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
protected Long id;
public void setId(Long id) {
this.id = id;
}
public Long getId() {
return id;
}
}
看起来Repo的返回值引用了相同的分离实体。真的吗?这让我很困惑。
答案 0 :(得分:2)
你的第一个实体没有分离。它会在您保存后立即进行管理。然后,当您获取信用卡时,EntityManager将返回相同的对象,因为它是保存信用卡对象的相同EntityManager实例,因此该对象仍然受管理。
答案 1 :(得分:0)
尝试使用evict然后在内存中使用任何删除对象
。this.getSession()逐出(Objeto);