在更新我的实体时,我的旧实体也会更新

时间:2015-09-24 18:15:30

标签: java hibernate jpa entity persistence

我正在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的返回值引用了相同的分离实体。真的吗?这让我很困惑。

2 个答案:

答案 0 :(得分:2)

你的第一个实体没有分离。它会在您保存后立即进行管理。然后,当您获取信用卡时,EntityManager将返回相同的对象,因为它是保存信用卡对象的相同EntityManager实例,因此该对象仍然受管理。

答案 1 :(得分:0)

尝试使用evict然后在内存中使用任何删除对象

this.getSession()逐出(Objeto);