2016-02-08 434 views
0

我在將列添加到現有連接表時遇到了一些問題。以下是我希望我的連接表看起來如何,但我在實際實現中缺少連接表中的tenant_id列。將列添加到Join表?

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; 

} 

和代碼基本上放Report類和Label類的id到標籤表到位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,並執行此更新時,我的數據庫中的值被填充/創建。有沒有辦法做到這一點?任何幫助,將不勝感激。謝謝!

+1

我對你的模式和你的問題略有困惑,但請注意,如果你想記錄關於關係的額外信息,那麼你需要通過創建一個指向「標記」的附加實體來替換'@ManyToMany'併爲此新實體標記'@OneToMany'關係。看到這裏:http://stackoverflow.com/questions/5127129/mapping-many-to-many-association-table-with-extra-columns –

+0

@AlanHay謝謝你讓我知道。你是說在我想插入任何新行的標記中,我必須創建一個名爲'tagging'的實體,並使用'report_id','label_id'和'tenant_id'創建'@ OneToMany'關係? – user1871869

回答

0

只要改變上面提到的標記(類)表,但添加默認值,存在於標籤表(類)中,然後根據需要更新標記表(類)。

1

我不確定,我是否正確理解您的問題。但是,如果你需要添加tenant_id並填充它,你可以做下一步。

首先,默認爲空添加新列:

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列。