it-swarm.com.ru

как обновить сущность с данными весны jpa

У меня есть сущность и Junit, я хочу проверить, что метод обновления работает нормально, но когда я вызываю метод сохранения из CrudRepository, я получаю новую запись в своей таблице вместо обновленной сущности.

Это моя сущность:

@Entity(name = "PERSON")
public class Person {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "PERSON_ID")
    private Integer id;
    @Column(name = "FIRST_NAME")
    private String firstName;
    @Column(name = "LAST_NAME")
    private String lastName;
//getters and setters
}

Это мой класс обслуживания:

@Service
public class PersonServiceImpl implements PersonService {

    @Autowired
    private PersonRepository personRepository;

    @Override
    public Person updatePerson(Person oldPerson) throws Exception { 

        return personRepository.save(oldPerson);
    }
}

Это мой репозиторий

public interface PersonRepository extends CrudRepository<Person, String> {
}

Это мой тест:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { JPAConfigurationTest.class })
@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)
@Transactional
public class UpdatePersonServiceIntegrationTest {
        @Autowired
    PersonService personService;

        @Before
    public void setUp() throws Exception {
        Person person = new Person(1);
        person.setFirstName("Nicolas");
        person.setLastName("Spessot");

        personService.createPerson(person); //This invokes save
    }

        @Test
    public void updatingPerson() throws Exception{
        Person person = new Person(1);
        person.setFirstName("Juan");
        person.setLastName("Riquelme");

        personService.updatePerson(person);

        Person retrieved = personService.retrievePerson(1); //This invokes findOne

        assertEquals(1, person.getId());
        assertEquals("Juan", person.getFirstName());
        assertEquals("Riquelme", person.getLastName());
    }
}

Заранее спасибо

16
nspessot

Проблема в вашем методе updatePerson в вашем классе обслуживания. В частности:

return personRepository.save(oldPerson);

Все, что вы сейчас делаете, это спасаете Человека. Вот почему это создает вторую запись.
Что вы должны сделать, это сначала найти oldPerson, 

Person p = personRepository.findOne(oldPerson.getId())

затем обновите его атрибуты, а затем сохраните его, как вы делали это раньше ... Надеюсь, это поможет.

25
chinesewhiteboi

Вы должны реализовать equals() и hashCode() в классе Person.

@Entity(name = "PERSON")
public class Person {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "PERSON_ID")
    private Integer id;
    @Column(name = "FIRST_NAME")
    private String firstName;
    @Column(name = "LAST_NAME")
    private String lastName;
    //getters and setters

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (id == null || obj == null || getClass() != obj.getClass())
            return false;
        Person that = (Person) obj;
        return id.equals(that.id);
    }
    @Override
    public int hashCode() {
        return id == null ? 0 : id.hashCode();
    }
}
5
ciri-cuervo

Я думаю, что хранилище должно быть

public interface PersonRepository extends CrudRepository<Person, Integer> {

Так как ваш идентификатор - это целое число, а не строка, также я предполагаю, что ваш

personService.createPerson(person); 

Внутренне используйте метод сохранения репо.

Мой второй совет 

@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)}

Это означает, что контекст приложения должен быть сгенерирован снова, а также bean-компонентами, поэтому, пожалуйста, убедитесь, что в вашей конфигурации в persistence.xml не настроен h2bml для создания .... Также подумайте о вызове метода flush в вашей службе.

1
Koitoer

Два способа заставить эту работу

переопределить метод CompareTo как 

@Entity(name = "PERSON")
public class Person implements Comparable<Person>{
 //... all your attributes goes here
 private Integer id;

 @Override
public int compareTo(Person person) {
   return this.getId().compareTo(person.getId());
}} 

или же 

вам нужно переопределить методы equals и hashcode в вашем классе сущностей, как показано ниже 

 @Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (id == null || obj == null || getClass() != obj.getClass())
        return false;
    Person that = (Person) obj;
    return id.equals(that.id);
}
@Override
public int hashCode() {
    return id == null ? 0 : id.hashCode();
}
0
Venkata Santhosh Piduri