我有2个实体:Field和ViewOptions
省略了与问题无关的字段和方法
表格结构:
CREATE TABLE FIELD (
ID INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY (ID),
);
CREATE TABLE VIEW_OPTIONS (
ID INT NOT NULL AUTO_INCREMENT,
FIELD_ID INT NOT NULL,
PRIMARY KEY (ID),
INDEX (FIELD_ID ASC),
CONSTRAINT
FOREIGN KEY (FIELD_ID)
REFERENCES FIELD (ID)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
映射:
@Table(name = "FIELD")
@Entity
public class Field {
@OneToOne(mappedBy ="field")
ViewOptions viewOptions;
@Table(name = "VIEW_OPTIONS")
@Entity
public class ViewOptions {
@OneToOne
@JoinColumn(name = "FIELD_ID")
Field field;
在此关系中,所有者方是ViewOptions,反面是Field。 我想要做的是交换双方 - 让Field成为所有者。 但是,如果我标记像这样的viewOptions
@OneToOne
@JoinColumn(name = "FIELD_ID")
ViewOptions viewOptions;
Hibernate期望Field表中的连接列。
有没有办法告诉hibernate在VIEW_OPTIONS中搜索连接列?
答案 0 :(得分:3)
不,这不是它的工作原理。如果您希望Field
对象成为关系的所有者,则FIELD表必须具有VIEW_OPTIONS id的列。
答案 1 :(得分:2)
在双向关系中,其中一方(并且只有一方)必须是所有者:所有者负责更新关联列。要声明一方不对关系负责,使用属性mappedBy。 mappedBy引用所有者方的关联的属性名称。
此处的连接列注释是可选的,如果在所有者端未声明@JoinColumn,则默认值适用。将在所有者表中创建一个连接列,其名称将是所有者端关系名称的串联,_(下划线),以及所拥有的主键列的名称侧。
所以,如果你想让Field成为所有者:
@Table(name = "FIELD")
@Entity
public class Field {
@OneToOne
ViewOptions viewOptions;
@Table(name = "VIEW_OPTIONS")
@Entity
public class ViewOptions {
@OneToOne(mappedBy ="viewOptions")
Field field;