JPA OneToOne单向映射

时间:2014-04-05 11:04:56

标签: java hibernate jpa hibernate-mapping one-to-one

我有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中搜索连接列?

2 个答案:

答案 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;