2017-06-20 26 views
1

に多くを持つエンティティを保存するときに、私は2つのJPAエンティティJPA:主キー違反1

@Entity 
@Data 
public class SolManConfig { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    private String data; 

    @ManyToOne(cascade= CascadeType.ALL) 
    private Tenant tenant; 
} 


@Entity 
@AllArgsConstructor 
class Tenant { 
    @Id 
    private String tenantID; 
} 

とリポジトリ

interface SolmanConfigPrivateRepository extends CrudRepository <SolManConfig, Long> { 

} 

を持っているが、私は次のコード

public void addConfig(SolManConfig solManConfig){ 
    String tenantId = userProvider.get(); 
    solManConfig.setTenant(getCurrentTenant()); 
    Tenant tenant = new Tenant(tenantId); 
    dbRepository.save(solManConfig); 

} 
で新しいエンティティを作成します

私はリポジトリのsaveメソッドを使ってSolmanConfigを保存することができます。

私は同じテナントに新しいSolmanConfigを保存しようとすると、私はどのように私は別のものがデータベースにすでに存在する場合、新しいテナントを作成しようとしないためにJPAを伝えることができ

Unique index or primary key violation: "PRIMARY_KEY_9 ON PUBLIC.TENANT(TENANTID) 

エラーが出ます(しかし、代わりに既存のものを参照する)?

+1

あなたはエンティティを作成し、保存し –

+0

を起動する方法を示して、私はあなたに感謝...私は見 –

答えて

1

あなたは休止状態のセッションに違反しています。あなたがしなければならないのは、idからdbからfindTenantに、エンティティをdb(特定の参照)から取り上げて保存します。それ以外の場合、Hibernateは更新の代わりに保存しようとします。

public void addConfig(SolManConfig solManConfig){ 
    String tenantId = userProvider.get(); 
    solManConfig.setTenant(getCurrentTenant()); 
    Tenant tenant = tentantRepository.findOne(tenantId); 
    dbRepository.save(solManConfig); 
} 

Spring data JPAには、保存と更新の方法が1つあります。それは保存です。新しいオブジェクトを渡すと保存され、それ以外の場合は更新されます。 「新しい目的」は何を意味していますか?それは、dbから抽出されていないオブジェクトを意味します。

+0

(私は私の質問にだけ編集した)私はコンストラクタで手動で設定 –

0

テナントIDはどのように設定されていますか?明らかにJPAアノテーションに基づいて生成されていないので、手動で設定するとします。

あなたがすべてでそれを設定しない場合は、tenantIDは(当時もtenantID ヌルを持っている)別のテナントを挿入するときにこのように、一意性制約に違反することになる、ヌルになります。

+0

私の質問を編集しました! –

関連する問題