java - 如何使用 Spring 数据 jpa 更新实体

标签 java spring hibernate 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());
    }
}

提前致谢

最佳答案

问题出在服务类中的 updatePerson 方法中。具体来说:

return personRepository.save(oldPerson);

您当前所做的只是保存一个人。这就是它创建第二个条目的原因。 你应该先找到oldPerson,

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

然后更新它的属性,然后像以前一样保存它。 希望对您有所帮助。

关于java - 如何使用 Spring 数据 jpa 更新实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22031128/

相关文章:

java - BCrypt:有没有办法在数据库中插入已经加密的密码?

java - 使从 JSON 模式生成的 POJO 类可序列化

java - 如何将注销操作重定向到 Play 中的特定页面?

java - 3D 高度图地形和碰撞检测

java - 如何记录 Spring Data JPA 存储库方法执行时间?

Java Spring Boot 配置和组件

Java 8u40 Math.round() 非常慢

hibernate - Liquibase:MySqlSyntaxErrorException:表已存在

database - Hibernate一对多映射错误-mappedBy reference an unknown target entity property错误

java - hibernate 更新JPA外键