Spring-JPA双向关系

Spring-JPA双向关系,spring,hibernate,jpa,Spring,Hibernate,Jpa,假设我有一个Post和Tag实体,有很多关系。我只想存储唯一的标签。问题是,Hibernate不允许我添加一个贴子,如果它包含一个标签,而标签表已经有了这个标签的名称。在本例中,我只想引用已经存在的标记 如果我从标记中删除唯一限制,它可以正常工作,但是我可以在标记表中使用相同的标记名,这将是多余的 我是否需要检查POST请求,如果它的任何标记已经存在,然后修改请求以适应,或者有更好的方法吗 职位: @实体 @表(name=“posts”) 公营职位{ @身份证 @GeneratedValue(策

假设我有一个Post和Tag实体,有很多关系。我只想存储唯一的标签。问题是,Hibernate不允许我添加一个贴子,如果它包含一个标签,而标签表已经有了这个标签的名称。在本例中,我只想引用已经存在的标记

如果我从标记中删除唯一限制,它可以正常工作,但是我可以在标记表中使用相同的标记名,这将是多余的

我是否需要检查POST请求,如果它的任何标记已经存在,然后修改请求以适应,或者有更好的方法吗

职位:

@实体
@表(name=“posts”)
公营职位{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长id;
@多个(级联=级联类型.ALL)
@JoinTable(name=“posts\u tags”,
joinColumns=@JoinColumn(name=“posts\u id”,referencedColumnName=“id”),
inverseJoinColumns=@JoinColumn(name=“tags\u id”,referencedColumnName=“id”))
private Set tags=new HashSet();
// ...
标签:

@实体
@表(name=“tags”)
公共类标签{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长id;
@NotNull
@尺寸(最大值=15)
@列(唯一=真)
私有字符串名称;
@多个(mappedBy=“标记”)
@杰索尼奥雷
private Set posts=new HashSet();
//...
后置控制器:

@PostMapping(“/posts”)
public Post createPost(@Valid@RequestBody Post){
返回postRepository.save(post);
}

所有这些都与
持久性上下文相关

在您的情况下,您需要首先检查其任何标记是否已经存在,如果是,则使用该标记附加到您的请求。

如果您检查该对象,则该对象将处于
持久性上下文
状态,并且hibernate将知道相同的标记已经存在,并且它不会尝试插入新标记,您也不会得到任何错误。

“如果标记表已经存在,hibernate将不允许我添加Post。”-这到底是什么意思?请包括调试详细信息。如果帖子包含与标签表中任何标签名称相同的标签,则会抛出java.sql.SQLIntegrityConstraintViolationException:key“UK_t48hdq560gs3gap9g7jg36kgc”的重复条目“apple”