我在向现有连接表添加列时遇到了一些麻烦。下面是我希望我的连接表看起来像,但我在实际实现中缺少连接表中的tenant_id
列。
以下是我的JPA实现代码:
@Entity
@Table(name = "label")
public class Label {
@Column(name = "tenant_id")
private String tenant_id;
@Column(name = "label_id")
private String label_id;
@JsonIgnore
@ManyToMany(targetEntity = Report.class, cascade = { CascadeType.PERSIST, CascadeType.MERGE })
@JoinTable(name = "tagging", joinColumns = @JoinColumn(name = "label_id"), inverseJoinColumns = @JoinColumn(name = "report_id"))
private Set<Report> reports;
}
@Entity
@Table(name = "report")
public class Report {
@Column(name = "tenant_id")
private String tenant_id;
@Column(name = "report_id")
private String report_id;
@column(name = "created_by")
private String created_by;
@JsonIgnore
@ManyToMany(targetEntity = Label.class, cascade = { CascadeType.PERSIST, CascadeType.MERGE })
@JoinTable(name = "tagging", joinColumns = @JoinColumn(name = "report_id"), inverseJoinColumns = @JoinColumn(name = "label_id"))
private Set<Label> labels;
}
代码基本上将id
类和Report
类的Label
放入标记表中,分别代替report_id
和label_id
列。我遇到的问题是我想将tenant_id
列添加到tagging
表中的每个现有条目。我试过了
ALTER TABLE tagging ADD COLUMN tenant_id varchar(255) NOT NULL;
但由于我有预先存在的数据,因此我收到错误消息,指出tenant_id
必须具有默认值。我想以某种方式用以下内容更新每个tagging
表:
select tenant_id from report where report.id = tagging.report_id
,并在填充/创建数据库中的值时执行此更新。有没有办法做到这一点?任何帮助,将不胜感激。谢谢!
答案 0 :(得分:1)
我不确定,我是否理解你的问题。但是如果你需要添加tenant_id
并填写它,你可以做下一步。
首先,添加默认为null的新列:
ALTER TABLE tagging ADD COLUMN tenant_id varchar(255) DEFAULT NULL;
其次,更新所有tenant_id:
UPDATE tagging t SET t.tenant_id = (SELECT r.tenant_id from report r WHERE r.id = t.report_id);
第三,修改tagging
表约束:
ALTER TABLE tagging MODIFY COLUMN tenant_id varchar(255) NOT NULL;
请注意,您必须确保report
表中NULL
列中的tenant_id
值未包含postsFromFriends
。
答案 1 :(得分:0)
如上所述,只需更改标记(类)表,但添加默认值,该值存在于标签表(类)中,然后根据需要更新标记表(类)。