我有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不要尝试创建新租户?
答案 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 )时,该唯一约束将被侵犯。