OneToMany 双向映射,缺少列
OneToMany bidirectional mapping, missing column
我不知道是什么问题。出于某种原因,Hibernate 抛出关于“在总线 table 中缺少 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
);
您的 Route
实体 @SecondaryTable(name = "bus")
过多。
同时你与总线有@ManyToOne关系:
@ManyToOne
@JoinColumn(name = "bus_id", referencedColumnName = "bus_id")
private Bus bus;
这告诉我辅助 table 没有意义 - 它仅用于一个实体被分成两个 table 的情况(例如:main table 和 details table)。在这里你显然有两个实体。
同样的评论适用于 @SecondaryTable(name = "location")
- 您需要删除此注释。
有关正确使用 @SecondaryTable
的详细信息,请参阅 Hibernate Tips: How to map an entity to multiple tables
我不知道是什么问题。出于某种原因,Hibernate 抛出关于“在总线 table 中缺少 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
);
您的 Route
实体 @SecondaryTable(name = "bus")
过多。
同时你与总线有@ManyToOne关系:
@ManyToOne
@JoinColumn(name = "bus_id", referencedColumnName = "bus_id")
private Bus bus;
这告诉我辅助 table 没有意义 - 它仅用于一个实体被分成两个 table 的情况(例如:main table 和 details table)。在这里你显然有两个实体。
同样的评论适用于 @SecondaryTable(name = "location")
- 您需要删除此注释。
有关正确使用 @SecondaryTable
的详细信息,请参阅 Hibernate Tips: How to map an entity to multiple tables