5 java jpa spring-data-jpa spring-boot
我正在尝试更新数据,据我所知,如果 id 为空,save() 方法会保存实体,或者如果在 DB 中找到给定的 id,则更新数据库中的现有实体。
但是,当我尝试保存数据时,它不会更新:
public Employer update() {
Employer emp = Employer.builder()
.id(2L) // it exists in database
.name('new company name')
.build();
return repository.save(emp);
}
Run Code Online (Sandbox Code Playgroud)
但是,当我从数据库中检索数据并更新其字段并再次保存时,它会更新:
public Employer update() {
Employer emp = repository.getOne(2L);
emp.setName('new company name');
return repository.save(emp);
}
Run Code Online (Sandbox Code Playgroud)
谁能解释这种行为的原因?我阅读了文档,但找不到与此相关的任何内容。
这是我的存储库:
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface Employer extends JpaRepository<Employer, Long> {
}
Run Code Online (Sandbox Code Playgroud)
和实体:
@Data
@Entity
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Table(schema = "public", name = "employer")
public class Employer {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NotBlank
@Size(max = 50)
private String name;
}
Run Code Online (Sandbox Code Playgroud)
cod*_*ant 13
您的实体Employer看起来处于分离/瞬态状态,并且您正在id手动传递不允许的值,因为它被标记为@GeneratedValue(strategy = GenerationType.IDENTITY)。
您需要做的是当您知道主键值即id值时,首先使用 findById() 方法从数据库中获取实体,通过该方法实体进入托管状态,然后尝试通过调用 save() 方法更新实体. 这将更新您的实体。
有关实体状态的更多信息,您可以参考:https : //vladmihalcea.com/a-beginners-guide-to-jpa-hibernate-entity-state-transitions/
| 归档时间: |
|
| 查看次数: |
12412 次 |
| 最近记录: |