没有外键但有反向外键的休眠多对一关系
Hibernate Many-To-One Relationship without Foreign Key but with reverse foreign key
我有以下数据库:
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 无法关联 table 并自动在 car table 中创建新的 car_id
和 car_owner_id
列。
任何人都可以帮助在模型中找到正确的组合以适当地关联 table。
@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
但这与问题无关。
两个 table 彼此了解称为双向 relationship.This 发生在每个 table 都有另一个 table 的密钥时。这就是您的 java 代码在数据库中的 expecting.Your tables 但具有单向关系。意思是一个 table 知道另一个,但不知道两者。你的 car_owner
因为外键 CONSTRAINT car_owner_car_fk FOREIGN KEY
知道 car
但你的 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 代码。
我有以下数据库:
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 无法关联 table 并自动在 car table 中创建新的 car_id
和 car_owner_id
列。
任何人都可以帮助在模型中找到正确的组合以适当地关联 table。
@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
但这与问题无关。
两个 table 彼此了解称为双向 relationship.This 发生在每个 table 都有另一个 table 的密钥时。这就是您的 java 代码在数据库中的 expecting.Your tables 但具有单向关系。意思是一个 table 知道另一个,但不知道两者。你的 car_owner
因为外键 CONSTRAINT car_owner_car_fk FOREIGN KEY
知道 car
但你的 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 代码。