JPA:保存具有多对一的实体时的主键冲突

时间:2017-06-20 10:14:49

标签: java jpa

我有2个JPA实体

@Entity
@Data
public class Config {
    @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 <Config, Long> {

}

我使用以下代码创建新实体

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

}

我设法使用存储库的save方法保存Config。

如果我尝试使用相同的租户保存新的配置,我会收到错误

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

如果数据库中已有另一个租户(但引用现有租户),我如何告诉JPA不要尝试创建新租户?

2 个答案:

答案 0 :(得分:2)

您违反了休眠会话。你需要做的是,从db by id到find Tenant,从db(特定参考)中获取set 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有一种保存和更新方法。它节省了。传递新对象时,会保存,否则会更新。它是什么意思&#39;新对象&#39;?这意味着,一个没有从数据库中提取的对象。

答案 1 :(得分:0)

如何设置租户ID?显然没有生成(根据JPA注释),所以我想你手动设置它?

如果您根本没有设置它,则tenantID将 null ,因此当插入另一个租户(当时还有tenantID null )时,该唯一约束将被侵犯。