添加列到Join表?

时间:2016-02-08 05:44:42

标签: java mysql database jpa join

我在向现有连接表添加列时遇到了一些麻烦。下面是我希望我的连接表看起来像,但我在实际实现中缺少连接表中的tenant_id列。

Database Schema

以下是我的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_idlabel_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,并在填充/创建数据库中的值时执行此更新。有没有办法做到这一点?任何帮助,将不胜感激。谢谢!

2 个答案:

答案 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)

如上所述,只需更改标记(类)表,但添加默认值,该值存在于标签表(类)中,然后根据需要更新标记表(类)。