2013-04-11 14 views
12

想像して、次のモデル:Spring JPAの既存のエンティティを参照する新しいエンティティを保存する方法は?

従業員:

@ManyToMany(cascade = CascadeType.ALL) 
@JoinTable(name = "employee_project", joinColumns = @JoinColumn(name = "Emp_Id"), inverseJoinColumns = @JoinColumn(name = "Proj_id")) 
private Set<Project> projects = new HashSet<Project>(); 

プロジェクト:今

@ManyToMany(mappedBy = "projects") 
private Set<Employee> employees = new HashSet<Employee>(); 

私は既存のプロジェクトを参照する新しい従業員を作成し、その従業員を保持しようとすると、Iエラーが発生する:

detached entity passed to persist: Project 

私はemploを作成します

public void createNewEmployee(EmployeeDTO empDTO) { 

    Employee emp = new Employee(); 
    // add stuff from DTO, including projects 

    repository.saveAndFlush(emp); // FAILS 
} 

を、私はこのように、既存のものを更新します:イー次のように

public void updateEmployee(EmployeeDTO empDTO) { 

    Employee emp = repository.findOne(empDTO.getId()); 
    // set stuff from DTO, including projects 

    repository.saveAndFlush(emp); // WORKS! 
} 

答えて

19

私はあなたが適切なトランザクション境界を拡大せずに、リポジトリと対話していると思います。デフォルトでは、トランザクション(およびセッション)境界はリポジトリメソッドレベルにあります。これにより、ProjectインスタンスがEntityManagerから切り離され、永続操作に含めることができなくなります。ここ

ソリューションは、クライアントにトランザクション境界を拡張することです:

@Component 
class YourRepositoryClient { 

    private final ProjectRepository projects; 
    private final EmployeeRepository employees; 

    // … constructor for autowiring 

    @Transactional 
    public void doSomething() { 
    Project project = projects.findOne(1L); 
    Employee employee = employees.save(new Employee(project)); 
    } 
} 

このアプローチはProjectインスタンスを管理エンティティに滞在ので、インクルードが正しく処理された新鮮なEmployeeインスタンスに対して実行する操作を持続させ。

2つのリポジトリのやりとりとの違いは、2番目のケースでは、デタッチされたインスタンス(すでに永続化されており、IDセットがあります)です。最初の例では完全に管理されていないインスタンスidが設定されていません。 idプロパティは、リポジトリにpersist(…)merge(…)の呼び出しを区別させるものです。したがって、最初の方法ではpersist(…)がトリガーされ、2番目の方法ではmerge(…)が発生します。

+0

ありがとうございます。でも、リポジトリからプロジェクトをフェッチせずに私の更新メソッドがうまく動作しない理由を知りたいのですが(詳細は私の更新された質問を参照してください) – wannabeartist

+1

ここで質問を拡張するのは良い考えではありません。ある程度答えてください。新しい質問をよくする。私はそれに応じて私の答えを更新します。 –

+0

その春の '@ Transactional'またはJPAですか、それとも重要ですか? – CorayThan

関連する問題