【发布时间】:2017-11-30 09:30:38
【问题描述】:
我正在使用由嵌入式内存数据库支持的 Spring JPA,特别是 Apache Derby。
简单地说,我有一个这样的实体类:
@Entity
public class Person {
@Id
@NotNull
@Column(unique = true, updatable = false, name = "PERSON_ID")
private Long personId;
@NotNull
@Size(min = 1)
private String name;
public Person() {
}
//continue....
在@Service 组件中,我有一个这样的方法:
@Autowired
private PersonRepository personRepository;
@Override
public void addPerson(Person person) {
personRepository.save(movie);
}
存储库定义如下:
public interface PersonRepository extends CrudRepository<Person, Long> { }
问题如下:主键约束没有像我预期的那样强制执行。
更具体地说,如果我有两个具有相同键的 Person 对象:
Person person1 = new Person(1L, "Johan");
Person person2 = new Person(1L, "Tom");
我依次调用add方法:
serviceObject.addPerson(person1);
serviceObject.addPerson(person2);
将会发生的是 personRepository.save(movie) 方法将保存一个具有相同 ID 的 Person 两次,从而覆盖之前的记录。最终只有一个具有该 ID 的 Person,其名称为“Tom”。我使用 findOne 方法检索记录,如下所示:
public Person getPersonById(long personId) {
Person person = personRepository.findOne(personId);
但是我预计第二次尝试会因为违反 PrimaryKey 约束而失败,并且名称没有从“Johan”更改为“Tom”。
问题:
- 为什么会这样?
- 我知道我可以在数据库级别强制执行此规则。这是实现它的唯一方法吗?就我而言,使用 Apache Derby,我可以实现这一点吗?或者如何在 JPA 级别强制执行通常的主键约束,以便拒绝具有重复键的记录而不是覆盖之前的记录?
P.S.:我有兴趣手动插入主键,所以 @GeneratedValue 或任何其他原则上会阻止传递两次相同键的机制都不是一个选项。
【问题讨论】:
标签: hibernate jpa spring-data spring-data-jpa derby