come aggiornare un’entità con la primavera i dati dell’app

Ho un’entità e una Junit, voglio testare che il metodo di aggiornamento sta lavorando bene, ma quando eseguo il metodo di salvataggio da CrudRepository ottenere una nuova voce nella mia tabella aggiornata entità.

Questo è il mio entità:

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

Questa è la mia classe di servizio:

@Service
public class PersonServiceImpl implements PersonService {

    @Autowired
    private PersonRepository personRepository;

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

        return personRepository.save(oldPerson);
    }
}

Questo è il mio repository

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

Questo è il mio test:

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

Grazie in anticipo

  • Assicurarsi che i valori di cui è impostato. È possibile verificare che la registrazione di quei valori prima chiamata di save ().
  • Hai dimenticato di implementare equals() e hashcode() in Persona. In considerazione solo campo id realizzazione. Che dovrebbe risolvere il tuo problema.
InformationsquelleAutor nspessot | 2014-02-26



4 Replies
  1. 27

    Il problema è nel tuo updatePerson metodo nella classe di servizio. In particolare:

    return personRepository.save(oldPerson);

    Tutti si stanno facendo attualmente è il salvataggio di una Persona. Ecco perché è la creazione di una seconda voce.

    Che cosa si dovrebbe fare è trovare il oldPerson prima,

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

    quindi aggiornare i suoi attributi, e quindi salvarlo come avete fatto prima.
    Speranza che aiuta.

    • Penso che questa risposta è sbagliata. In primavera-dati-app, il risparmio effettivamente aggiorna l’oggetto, come indicato al paragrafo 5.2.1 in questo documento. docs.primavera.io/primavera-data/app/docs/corrente/riferimento/html (Se fosse vero, sarebbe una cattiva notizia. Quindi se si riceve un’entità con molti campi attraverso una molla controller mvc, non si poteva semplicemente salvarlo, è necessario impostare tutti i campi, il che significa un sacco di boilerpate codice.)
    • sì, dovrebbe funzionare anche con save come questo: public <S extends T> S save(S entity) { if (entityInformation.isNew(entity)) { em.persist(entity); return entity; } else { return em.merge(entity); } } ma non il suo lavoro per me…. Credo che la risposta sopra aiuta
    • Penso che questo non è corretto entityInformation.isNew(entity)
  2. 5

    È necessario implementare equals() e hashCode() in classe Persona.

    @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();
        }
    }
  3. 1

    Penso che il repository deve essere

    public interface PersonRepository extends CrudRepository<Person, Integer> {

    L’Id è un numero Intero non Stringa, inoltre presumo che il tuo

    personService.createPerson(person); 

    Internamente utilizzare il metodo di salvataggio dei repo.

    Il mio secondo consiglio è il

    @DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)}

    Questo significa che l’app Contesto devono essere generati di nuovo anche i fagioli, quindi si prega di essere sicuri che la vostra configurazione persistence.xml non avendo h2bml set per creare.
    Anche prendere in considerazione di chiamare il metodo flush nel vostro servizio.

    • Sto usando @DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)} perché io sono l’esecuzione di diversi test di integrazione e questo genera conflitti tra di loro. Non vedo motivo per cui dovrei chiamare a filo nel mio servizio? Credo che la molla dati di farlo, no?
  4. 0

    Due modi per fare questo lavoro

    override del metodo compareTo come

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

    o

    è necessario eseguire l’override di equals e hashcode metodi la classe di entità come di seguito

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

Lascia un commento