gpt4 book ai didi

postgresql - 由于键更改而尝试插入时外键约束失败

转载 作者:行者123 更新时间:2023-11-29 12:48:52 25 4
gpt4 key购买 nike

我有一个 Content 对象,它引用多对多关系中的一组 Tag 对象。作为持久化新 Content 对象的一部分,我在 PostgreSQL 中查看 Tag 是否已经存在,如果存在,那么我将对它的引用添加到 Content 对象并尝试保存 Content 对象。我遇到的问题是,当我这样做时,我将标签与 ID 相关联,例如1 和 2 与内容,当我尝试保存内容时,它因违反外键而失败,因为它说 ID 为 10 的标签不存在。我逐步执行了代码,当我将标签添加到与内容关联的标签集中时,它具有正确的 ID(即 1 和 2),那么为什么当我保存它时它会更改为不同的 ID?我正在使用 JPA、Hibernate、Spring 和 PostgreSQL。我在下面附加了 hibernate 内容对象。 “content_tag”表仅由 content_id 和 tag_id 组成,它们是对内容和标签表的外键引用。澄清一下:这个实例中的标签已经创建,我只是通过在数据库中搜索它们并将它们的关联添加到内容来添加关联

这里是错误:

org.postgresql.util.PSQLException: ERROR: insert or update on table "content_tag" violates foreign key constraint "tag_id_fkey"
Detail: Key (tag_id)=(12) is not present in table "tag".

显示保存尝试的代码:

for (final String tag : request.getContent().getTags()) {
final List<Tag> current = tagRepository.findByName(tag);
if (current.isEmpty()) {
final Tag newTag = new Tag(tag);
tagRepository.save(newTag);
content.addTag(newTag);
} else {
content.addTag(current.get(0));
}

}
final Content response = contentRepository.save(content);

这是内容类:

@Entity(name = "Content")
@Table(name = "content")
@TypeDef( name= "StringJsonObject", typeClass = StringJsonUserType.class)
public class Content implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Type(type = "StringJsonObject")
@Column(name = "text")
private String text;

public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

public String getText() {
return text;
}

public void setText(String text) {
this.text = text;
}

@ManyToMany(cascade = {
CascadeType.PERSIST,
CascadeType.MERGE
})
@JoinTable(name = "content_tag",
joinColumns = @JoinColumn(name = "tag_id"),
inverseJoinColumns = @JoinColumn(name="content_id")
)
private Set<Tag> tags = new HashSet<>();

public Set<Tag> getTags() {
return tags;
}

public void setTags(Set<Tag> tags) {
this.tags = tags;
}

public void addTag(Tag tag) {
tags.add(tag);
tag.getContents().add(this);
}

public void removeTag(Tag tag) {
tags.remove(tag);
tag.getContents().remove(this);
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Content)) return false;
return id != null && id.equals(((Content) o).getId());
}

@Override
public int hashCode() {
return 31;
}
}

标记实体:

@Entity(name = "Tag")
@Table(name = "tag")
public class Tag implements Serializable {

@Id
@GeneratedValue
private Long id;

@Column(name = "name")
private String name;

@ManyToMany(mappedBy = "tags")
private Set<Content> contents = new HashSet<>();

public Tag() {}

public Tag(String name) {
this.name = name;
}

public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Set<Content> getContents() {
return contents;
}

public void setContents(Set<Content> contents) {
this.contents = contents;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Tag tag = (Tag) o;
return Objects.equals(name, tag.name);
}

@Override
public int hashCode() {
return Objects.hash(name);
}
}

最佳答案

将内容实体中的关系配置更改为:

@JoinTable(name = "content_tag",
joinColumns = @JoinColumn(name = "content_id"),
inverseJoinColumns = @JoinColumn(name="tag_id")
)

关于postgresql - 由于键更改而尝试插入时外键约束失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58636164/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com