2017-10-23 12 views
0

私はJPA Springデータリポジトリのsaveメソッドを使うたびに、新しいオブジェクトを返し、保存されたオブジェクトのAutogenerated PKは更新されません。Springのデータ保存は永続コンテキストでPKを更新しませんか?

返されたsaveメソッドでローカルオブジェクトPKを手動で更新する必要がありますか?

コード:

private void saveProject(){ 
     Project savedProject = projectRepository.save(projectModel.getProject()); 
} 

savedProjectprojectModel.getProject

@Entity 
@Table(name = "project", schema = "public") 
public class Project { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    Integer id; 

    @LazyCollection(LazyCollectionOption.FALSE) 
    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) 
    List<User> users; 
    [...] 
} 

と同じではありません:だから

@Entity 
@Table(name = "user", schema = "public") 
public class User { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    Integer id; 

    String name; 
} 

、ユーザーPKがでgerenatedされますMySQL、そしてすべてアプリケーションのユーザーがまだPKレスであるため、新しいユーザーが作成されたプロジェクトを保存します。

+0

コードを入力してください。私はそれがこれを行うのを見ていない。 – chrylis

+0

DBが自動的にPKを生成すると、次回に更新して新しいオブジェクトを再度作成できないように、ローカルオブジェクトをsavedProjectでリロードする必要があります。 – multiplayer1080

+0

これはまだ問題を再現するのに十分な情報ではありません。リポジトリの 'save'メソッドは、JPAを使用しているときに新しいオブジェクトを返します。これは' @ Id'が読み込まれる( 'Project'を表示していない)必要があります。しかし、これは外資系の関係が進んでいるように見え、それは事態を複雑にする可能性があります。あなたのクラスを見せてください。 – chrylis

答えて

1

new Project()を保存するたびに、JPAはデータベースに新しいオブジェクトを作成します。

エンティティを更新するには、最初にエンティティをJPAコンテキストに持っていく必要があります。

Project lastProject = projectRepository.findById(PROJECT_ID); //lastProject is now updatable. 
lastProject.setName(...); //update the entity fields 
lastProject = projectRepository.save(lastProject); //project will now have the updated name. 
+1

完璧なソリューション...最後のプロジェクトのPKを使ってローカルプロジェクトを更新するだけで、数行追加しました... – multiplayer1080

関連する問題