2017-06-20 72 views
1

當主鍵衝突我有2個JPA實體JPA:有許多保存一個實體一個

@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); 

} 
新的實體

我設法使用存儲庫的保存方法保存SolmanConfig。

如果我嘗試保存新SolmanConfig具有相同的租,我得到一個錯誤

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

我怎麼能告訴JPA不要嘗試創建一個新的租戶,如果已經有另外一個數據庫(但要參考現有的)?

+1

顯示構建實體並調用保存的方法 –

+0

我編輯了我的問題 –

回答

1

您違反了hibernate會話。你需要做的,是從db的id到findTenant,從db(這個確定的引用)拿起set實體,然後保存。否則,Hibernate會嘗試保存而不是更新。

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

Spring data JPA有一種保存和更新的方法。這是保存。當你傳遞一個新的對象時,它會保存,否則它會更新。這是什麼意思「新對象」?這意味着,一個沒有從數據庫中提取的對象。

+0

我看到了......謝謝! –

0

租戶標識是如何設置的?這顯然不是生成的(根據JPA註釋),所以我想你手動設置它?

如果您沒有設置它在所有的tenantID將,插入另一個租戶(當時也有tenantID )因此當,唯一約束將被侵犯。

+0

我通過構造函數手動設置了它(我剛剛編輯了我的問題) –

相關問題