簡體   English   中英

如何按常規字段映射表?

[英]How could I map tables by regular fields?

我有一個表WebsitePages ,其中包含有關頁面的信息,但我需要列sequence要重復並由DB遞增。

CREATE TABLE `WebsitePages` (
  `id`                   INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
  `sequence`             INT UNSIGNED              NOT NULL,
  `title`                VARCHAR(255)              NOT NULL,
  `url`                  VARCHAR(255)              NOT NULL,
  `revision_id`          INT UNSIGNED DEFAULT 1    NOT NULL,

  UNIQUE `unique_pair` (`sequence`, `revision_id`),
  FOREIGN KEY (`sequence`) REFERENCES `WebsitePageSequence` (`id`),
);

WebsitePages序列表:

CREATE TABLE `WebsitePageSequence` (
  `id` INT UNSIGNED PRIMARY KEY AUTO_INCREMENT
);

我還有一個表,其中包含有關此頁面上小部件的信息,並且它還具有sequence列,並且應通過page_seq列將其與WebsitePages鏈接:

CREATE TABLE `WidgetSequence` (
  `id` INT UNSIGNED PRIMARY KEY AUTO_INCREMENT
);

CREATE TABLE `Widgets` (
  `id`         INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
  `sequence`   INT UNSIGNED           NOT NULL,
  `page_seq`   INT UNSIGNED           NOT NULL,
  `data`       LONGTEXT,
  `revision`   INT UNSIGNED DEFAULT 1 NOT NULL,

  UNIQUE `unique_pair` (`sequence`, `revision`),
  INDEX `idx_performance` (`page_seq`, `revision`),
  FOREIGN KEY (`sequence`) REFERENCES `WidgetSequence` (`id`),
  FOREIGN KEY (`page_seq`) REFERENCES `WebsitePages` (`sequence`),
);

我有一個像這樣的Java實體:

// Sequence.java
@MappedSuperclass
abstract public class Sequence implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "`id`")
    protected Long id;

get; set;
}

// WebsitePageSequence.java
@Entity
@Table(name = "`WebsitePageSequence`")
public class WebsitePageSequence extends Sequence {
}

// WidgetSequence.java
@Entity
@Table(name = "`WidgetSequence`")
public class WidgetSequence extends Sequence {
}

// Widget.java
@Entity
@Table(name = "`Widgets`")
public class Widget {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "`id`")
    protected Long id;

    @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinColumn(name = "sequence")
    protected WidgetSequence sequence = new WidgetSequence();

    @Column(name = "`data`", nullable = true)
    protected String data;

    // PROBLEM IN THIS CODE
    @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinColumn(name = "`page_seq`", referencedColumnName = "`sequence`")
    protected WebsitePageData pageData;
    // --------------------

    @Column(name = "`revision`")
    protected Long revision;

get; set;
}

@Entity
@Table(name = "`WebsitePage`")
public class WebsitePageData {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "`id`")
    protected Long id;

    @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinColumn(name = "`sequence`")
    protected WebsitePageSequence sequence = new WebsitePageSequence();

    @Column(name = "`title`", nullable = false)
    protected String title;

    @Column(name = "`url`", nullable = false)
    protected String url;

    @Column(name = "`revision_id`", nullable = false)
    protected Integer revisionId;

    // HERE I WANT TO FETCH ALL WIDGETS, THAT LINKED BY `Sequences`
    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "pageData")
    protected List<WidgetData> widgets;

get; set;
}

但是,當我嘗試使用小部件獲取WebsitePage時,我從休眠中得到了錯誤:

...Widget column: page_seq (should be mapped with insert="false" update="false")

它固定與

// PROBLEM IN THIS CODE
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "`page_seq`", referencedColumnName = "`sequence`", insertable = false, updatable = false)
protected WebsitePageData pageData;
// --------------------

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM