Search code examples
javahibernatejpaentitypersistence

When updaiting my entity, my old enity updates too


I'm testing my repository in JUnit4. I need to check my update() method, but when updating entity I get from repository, my detached old entity updates too.

    @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.

     }
    }

Here is my Repository

@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;
        }
}

It looks like returned value from Repo reference the same detached entity. Is that true? It confuses me.


Solution

  • Your first entity is not detached. It becomes managed as soon as you save it. When you then fetch the credit card, the EntityManager will return the same object, since it is the same EntityManager instance which saved the creditcard object, and so the object is still managed.