2017-11-30 17 views
0

저는 임베디드 메모리 내장 데이터베이스, 특히 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 또는 두 번 같은 키를 전달하는 데 원칙적으로 방해하는 다른 메커니즘이 옵션이 아닌 수동으로 기본 키를 삽입에 관심이 있습니다.

답변

2

당신이 저장 방법에 대한 구현을 보면,. 귀하의 경우 봄에 기본 키 생성을 남겨두고 코드에서 생성 된 ID를 사용하십시오.

1

스프링 데이터 jpa에서 자동 생성 ID가없는 관리 대상 엔티티를 저장하지 않으면 jpa는 ID를 찾습니다. 데이터베이스에 ID가 있으면 업데이트로 저장하므로 레코드를 업데이트하는 것입니다. 이 기록이 이미 존재하는 경우 병합하려고

@Transactional 
public <S extends T> S save(S entity) { 

    if (entityInformation.isNew(entity)) { 
     em.persist(entity); 
     return entity; 
    } else { 
     return em.merge(entity); 
    } 
} 

+0

"none"관리 엔티티는 무엇을 의미합니까? – Johan

+1

@Johan none managed는 영속성 컨텍스트가 아님을 의미합니다. –

+0

지속성 컨텍스트는 제약 조건을 적용하는 실제 데이터베이스를 의미합니까? – Johan