2017-06-20 63 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

我通过构造函数手动设置了它(我刚刚编辑了我的问题) –

相关问题