【问题标题】:How could I map tables by regular fields?如何按常规字段映射表?
【发布时间】:2014-03-07 05:11:01
【问题描述】:

我有一个表 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")

【问题讨论】:

    标签: java mysql hibernate annotations mapping


    【解决方案1】:

    已修复

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-29
      • 1970-01-01
      • 1970-01-01
      • 2011-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多