2017-11-30 90 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> { } 

問題は以下の通りです:PR私が期待するように、imary keyの制約は強制されません。

私は同じキーを持つ2つの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を2回保存し、元のレコードを上書きします。最終的に、そのIDを持つPersonは1人しかなく、その名前は "Tom"です。私は名前で、理由はいくつかの主キー制約違反で失敗する2番目の試みを期待しているだろうしかし

public Person getPersonById(long personId) { 
    Person person = personRepository.findOne(personId); 

は「ヨハン」と「トムから変更されていない次のように私はfindOne方法を使用してレコードを取得します"

質問

  • これが起こっているのはなぜ?
  • 私はこのルールをデータベースレベルで強制できたと私は理解しています。これを達成する唯一の方法ですか?私の場合、Apache Derbyを使用して、これを達成できますか? JPAレベルで通常の主キー制約を適用して、重複キーを持つレコードが前のレコードを上書きするのではなく拒否されるようにする方法はありますか?

P.S:私は、手動で主キーを挿入するに興味を持っていますので、@GeneratedValueか二度同じキーを渡すために、原則的に防止するであろう他のメカニズムがオプションではありません。

答えて

2

あなたは、Saveメソッドの実装を見てみると、。あなたのケースでは、主キーの生成を春にして、生成されたIDをコード内で使用してください。

1

バネデータjpaでは、自動生成されていないIDで管理されていないエンティティを保存すると、idがデータベースに存在する場合、jpaはその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

「なし」管理エンティティとはどういう意味ですか? – Johan

+1

@Johan none managedは永続コンテキストではないことを意味します。 –

+0

永続コンテキストでは、制約を適用する実際のデータベースを意味しますか? – Johan

関連する問題