【问题标题】:JPA OneToOne unidirectional mappingJPA OneToOne 单向映射
【发布时间】:2014-05-17 18:47:49
【问题描述】:

我有 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 期望字段表中的连接列。

有什么方法可以让hibernate在VIEW_OPTIONS中搜索join列?

【问题讨论】:

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


    【解决方案1】:

    不,这不是它的工作原理。如果您希望 Field 对象成为关系的所有者,则 FIELD 表必须有一个 VIEW_OPTIONS id 列。

    【讨论】:

    • 是的,谢谢。不想更改数据库结构,但看来我必须这样做。
    【解决方案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;
    

    【讨论】:

    • 你确定它会起作用吗?在这种情况下,所有者是字段,因此 Hibernate 将期望字段表中的 JoinColumn
    • 是的,我很确定,Hibernate 会自动创建一个字段。
    • 我不想让休眠创建数据库结构。它仅在开始时验证结构。因此,在您的示例中 JoinColumn 应该出现在 FIELD 表中。我的问题是关于 VIEW_OPTIONS 表的 movind JoinColumn 字段(反面)。
    • 帖子是单向关系,没有双向
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-17
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多