저는 임베디드 메모리 내장 데이터베이스, 특히 Apache Derby를 기반으로하는 Spring JPA를 사용하고 있습니다. 저장소가 정의되어Spring JPA의 기본 키 제약 적용하기
@Autowired
private PersonRepository personRepository;
@Override
public void addPerson(Person person) {
personRepository.save(movie);
}
은 다음과 같습니다
@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 구성 요소의
나는이 같은 방법이있다 : 간단하게 말해서는,이 같은 엔티티 클래스가 있습니다 :
public interface PersonRepository extends CrudRepository<Person, Long> { }
문제는 다음과 같습니다 : 홍보 imary key 제약 조건은 예상대로 적용되지 않습니다. 나는 동일한 키를 가진 두 사람 개체가있는 경우
은보다 구체적으로 :
serviceObject.addPerson(person1);
serviceObject.addPerson(person2);
어떻게 일어날 것은 그 personRepository은 다음과 같습니다
Person person1 = new Person(1L, "Johan");
Person person2 = new Person(1L, "Tom");
을 나는 순서대로 추가 메서드를 호출합니다. save (movie) 메서드는 동일한 ID를 가진 Person을 두 번 저장하므로 이전 레코드를 덮어 씁니다. 결국 그 ID를 가진 사람은 단 한 명 뿐이며 그 이름은 "Tom"입니다. 내가 이름으로 인해 일부 기본 키 제약 조건 위반이 실패 할 수있는 두 번째 시도를 예상했을 것이다 그러나
public Person getPersonById(long personId) {
Person person = personRepository.findOne(personId);
는 "요한"에서 "톰 변경되지 않는 다음과 같이 나는 findOne 방법을 사용하여 레코드를 검색 ".
질문 :
- 이런 일이 왜?
- 데이터베이스 수준에서이 규칙을 적용 할 수 있음을 이해합니다. 이것을 달성하는 유일한 방법입니까? 필자의 경우 Apache Derby를 사용하여이 작업을 수행 할 수 있습니까? 또는 JPA 레벨에서 일]적인 기본 키 제한 조건을 적용하여 중복 키가있는 레코드가 이전 키를 겹쳐 쓰지 않고 거부되도록하는 방}은 무엇입니까?
P.S는 : 난 그렇게 가 @GeneratedValue 또는 두 번 같은 키를 전달하는 데 원칙적으로 방해하는 다른 메커니즘이 옵션이 아닌 수동으로 기본 키를 삽입에 관심이 있습니다.
"none"관리 엔티티는 무엇을 의미합니까? – Johan
@Johan none managed는 영속성 컨텍스트가 아님을 의미합니다. –
지속성 컨텍스트는 제약 조건을 적용하는 실제 데이터베이스를 의미합니까? – Johan