【问题标题】:Hibernate JPA Annotations 1 to 0..1 relationshipHibernate JPA Annotations 1 到 0..1 的关系
【发布时间】:2011-10-27 09:22:13
【问题描述】:

我正在尝试设置 1to0..1(零或一)关系,但遇到了问题。

现在我的假设是使用@OneToMany,而不是@OneToOne。

基本上我希望我的“子”表保存“父”的外键(我非常松散地使用子和父)。我永远不需要独立加载“儿童”

这是我要实现的基本表结构

ITEM {
  ID
  RELATED_ITEM_ID
}

INVOICE {
  ID
}
CATALOGUE {
  ID
}

表示为 Java 类,如下所示

class Item {
...
}

class Invoice {
  @OneToMany(fetch=FetchType.EAGER, orphanRemoval = true, cascade = { javax.persistence.CascadeType.ALL })
  @Fetch(FetchMode.JOIN)
  @JoinColumn(name="RELATED_ITEM_ID", nullable=false)
  Set<Item> items;
}

class Catalogue {
  @OneToMany(fetch=FetchType.EAGER, orphanRemoval = true, cascade = { javax.persistence.CascadeType.ALL })
  @Fetch(FetchMode.JOIN)
  @JoinColumn(name="RELATED_ITEM_ID", nullable=false)
  Set<Item> items;
}

上面的代码,如果我只有 Invoice 或 Catalog 在 hibernate 中注册,将创建我想要的表,并且可以完美地工作。但是,一旦我注册了 Invoice 和 Catalog,hibernate 就会向我抛出错误

org.hibernate.MappingException: Duplicate property mapping of _itemsBackref found in package.name.Item

【问题讨论】:

    标签: java hibernate jpa


    【解决方案1】:

    我认为不可能将此架构与 Hibernate 映射(至少,只要 CustomerRecepient 不扩展同一个实体)。

    使用以下架构会更容易:

    ADDRESSES {
      ID
    }
    
    CUSTOMER {
      ID
      ADDRESS_ID
    }
    RECIPIENT {
      ID
      ADDRESS_ID
    }
    

    class Customer {
      @OneToOne(fetch=FetchType.EAGER, orphanRemoval = true, cascade = { javax.persistence.CascadeType.ALL })
      @Fetch(FetchMode.JOIN)
      @JoinColumn(name="ADDRESS_ID")
      Address address;
    }
    
    class Recipient {
      @OneToOne(fetch=FetchType.EAGER, orphanRemoval = true, cascade = { javax.persistence.CascadeType.ALL })
      @Fetch(FetchMode.JOIN)
      @JoinColumn(name="ADDRESS_ID")
      Address address;
    }
    

    【讨论】:

    • 我可能不应该以地址为例,地址存储很复杂。将外国人存储到一个地址是一个常见的陷阱,它会在路上咬住你。我已经更新了我原来的帖子。
    【解决方案2】:

    我最终以作弊的方式让它按我想要的方式工作。理想情况下,我不想要这样的层次结构,但我需要让它工作,我觉得这是与 hibernate 工作的妥协。

    ITEM {
      ID
      RELATED_ITEM_ID
      DTYPE
    }
    
    INVOICE {
      ID
    }
    
    CATALOGUE {
      ID
    }
    

    表示为 Java 类,如下所示

    @Entity
    @Table(name="RECIPIENTS")
    abstract class Item {
      ...
    }
    
    @Entity
      public class InvoiceItem extends Item {
    }
    
    @Entity
      public class CatalogueItem extends Item {
    }
    
    
    class Invoice {
      @OneToMany(fetch=FetchType.EAGER, orphanRemoval = true, cascade = { javax.persistence.CascadeType.ALL })
      @Fetch(FetchMode.JOIN)
      @JoinColumn(name="RELATED_ITEM_ID", nullable=false)
      Set<InvoiceItem> items;
    }
    
    class Catalogue {
      @OneToMany(fetch=FetchType.EAGER, orphanRemoval = true, cascade = { javax.persistence.CascadeType.ALL })
      @Fetch(FetchMode.JOIN)
      @JoinColumn(name="RELATED_ITEM_ID", nullable=false)
      Set<CatalogueItem> items;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-18
      • 2019-02-10
      • 2011-06-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多