【问题标题】:OneToMany bidirectional mapping, missing columnOneToMany 双向映射,缺少列
【发布时间】:2020-07-15 05:54:48
【问题描述】:

我不知道是什么问题。出于某种原因,Hibernate 抛出有关“总线表中缺少 route_id 列”的错误。如果我创建列并让它为空,那么一切都会按我的意愿进行。为什么需要它?我不需要它。也许有人可以帮助我,在此先感谢

@Entity
@Getter
@Setter
@Table(name = "bus")
public class Bus {
    @Id
    @Column(name = "bus_id", columnDefinition = "VARCHAR(36)")
    private String id = UUID.randomUUID().toString();

    @NotBlank
    @Length(min = 4, max = 15)
    private String name;

    @OneToMany(mappedBy = "bus", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    private Set<Route> routes;
}

CREATE TABLE bus
(
    id     BIGINT       NOT NULL AUTO_INCREMENT PRIMARY KEY,
    bus_id VARCHAR(36)  NOT NULL UNIQUE,
    name   VARCHAR(255) NOT NULL UNIQUE
);
@Entity
@Getter
@Setter
@Table(name = "route")
@SecondaryTables({
        @SecondaryTable(name = "location"),
        @SecondaryTable(name = "bus")
})
public class Route {
    @Id
    @Column(name = "route_id", columnDefinition = "VARCHAR(36)")
    private String id = UUID.randomUUID().toString();

    private int leaving;
    private int arrival;
    @Column(columnDefinition = "DECIMAL", precision = 4, scale = 2)
    private BigDecimal price;

    @ManyToOne
    @JoinColumn(name = "bus_id", referencedColumnName = "bus_id")
    private Bus bus;

    @ManyToOne
    @JoinColumn(name = "route_to", referencedColumnName = "name")
    private Location routeTo;

    @ManyToOne
    @JoinColumn(name = "route_from", referencedColumnName = "name")
    private Location routeFrom;
}
CREATE TABLE route
(
    id         BIGINT        NOT NULL AUTO_INCREMENT PRIMARY KEY,
    route_id   VARCHAR(36)   NOT NULL UNIQUE,
    bus_id     VARCHAR(36)   NOT NULL,
    route_from VARCHAR(255)  NOT NULL,
    route_to   VARCHAR(255)  NOT NULL,
    leaving    INT(4) UNSIGNED,
    arrival    INT(4) UNSIGNED,
    price      DECIMAL(4, 2) NOT NULL,
    FOREIGN KEY (bus_id) REFERENCES bus (bus_id) ON DELETE CASCADE,
    FOREIGN KEY (route_from) REFERENCES location (name) ON UPDATE CASCADE ON DELETE CASCADE,
    FOREIGN KEY (route_to) REFERENCES location (name) ON UPDATE CASCADE ON DELETE CASCADE
);

【问题讨论】:

    标签: spring hibernate jpa spring-data-jpa spring-data


    【解决方案1】:

    您的Route 实体上有过多的@SecondaryTable(name = "bus")

    同时你与总线有@ManyToOne 关系:

    @ManyToOne
    @JoinColumn(name = "bus_id", referencedColumnName = "bus_id")
    private Bus bus;
    

    这告诉我辅助表没有意义 - 它仅用于一个实体在两个表之间拆分的情况(例如:主表和详细信息表)。这里显然有两个实体。

    @SecondaryTable(name = "location") 也有同样的注释 - 您需要删除此注释。

    有关正确使用@SecondaryTable 的更多信息,请参阅Hibernate Tips: How to map an entity to multiple tables

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 2015-03-10
      • 1970-01-01
      • 2019-05-22
      • 2020-06-26
      • 2022-11-06
      • 2011-06-25
      相关资源
      最近更新 更多