gpt4 book ai didi

java - 没有外键但有反向外键的 hibernate 多对一关系

转载 作者:行者123 更新时间:2023-11-30 08:51:41 26 4
gpt4 key购买 nike

我有以下数据库:

CREATE TABLE car_owner (
car_owner_id int(11) NOT NULL,
car_id_fk int(11) DEFAULT NULL,
PRIMARY KEY (car_owner_id),
KEY car_owner_car_fk_idx (car_id_fk),
CONSTRAINT car_owner_car_fk FOREIGN KEY (car_id_fk) REFERENCES car (car_id) ON DELETE NO ACTION ON UPDATE NO ACTION,
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


CREATE TABLE car (
car_id int(11) NOT NULL AUTO_INCREMENT,
car_type varchar(45) DEFAULT NULL,
car_plates varchar(25) DEFAULT NULL,
PRIMARY KEY (car_id),
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;

在 java 模型中:

对于 CarOwner 我有:

@Entity
@Table(name="car_owner")
@NamedQuery(name="CarOwner.findAll", query="SELECT co FROM CarOwner co")
public class CarOwner implements Serializable {

@Id
@GeneratedValue
@Column(name="car_owner_id")
private Integer carOwnerId;
.....

//bi-directional many-to-one association to Car
@OneToMany(fetch = FetchType.EAGER)
@JoinColumn(name = "car_id_fk", referencedColumnName = "car_id")
private List<Car> cars;

对于汽车:

@Entity
@Table(name="car")
@NamedQuery(name="Car.findAll", query="SELECT c FROM Car c")
public class Car implements Serializable {

@Id
@GeneratedValue
@Column(name="car_id")
private Integer carId;
......

//bi-directional many-to-one association to car_owner
@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name = "car_owner_id")
private CarOwner carOwner;

这里的问题是 Hibernate 无法关联表并自动在 car 表中创建新的 car_idcar_owner_id 列。

任何人都可以帮助在模型中找到正确的组合以适本地关联表格。

最佳答案

@JoinColumn 应该是关系的所有者(在一对多中,多方被视为所有者)。

所以我会在car中修改这个

 @ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name = "car_owner_id",insertable=false, updatable=false)
private CarOwner carOwner;

这在 CarOwner

@OneToMany(fetch = FetchType.EAGER,mappedBy = "carOwner")
private List<Car> cars;

作为旁注,我也不会使用 EAGER 但这与问题无关。


两个表相互了解称为双向关系。当每个表都有另一个表的键时会发生这种情况。这就是您的 Java 代码所期望的。然而,您在数据库中的表具有单向关系。这意味着一张 table 知道另一张 table ,但不知道两张 table 。你的 car_owner 知道 car 因为外键 CONSTRAINT car_owner_car_fk FOREIGN KEY 但你的 car 不知道car_owner 两者都完全有效。

现在的问题是,在您的 Java 代码中,您将其视为双向关系。

//bi-directional many-to-one association to car_owner
@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name = "car_owner_id")
private CarOwner carOwner;

但是 car 没有 car_owner_id 为什么要将它视为双向关系。

现在要么更新数据库使它们成为 bi,要么更改 java 代码。

关于java - 没有外键但有反向外键的 hibernate 多对一关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30448259/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com