繁体   English   中英

无需外键但使用反向外键即可休眠多对一关系

[英]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模型中:

对于车主,我有:

@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_owner_id自动在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代码所期望的。但是数据库中的表却具有单向关系。 意思是一张桌子知道另一张桌子,但不是两者都知道。 您的car_owner知道car因为有外键CONSTRAINT car_owner_car_fk FOREIGN KEY但是您的carcar_owner完全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为什么car_owner_id双向关系。

现在,要么更新数据库以使其成为双向文件,要么更改Java代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM