Hibernate - 从多个字段到同一实体的关系

我有实体 FooDetails,它有两个字段:客户和位置列表。Customer 有 Address(@OneToOne 单向映射),Location 也有 Address 和 @OneToOne 映射。

碰巧“客户”中的“地址”和“位置”中的“地址”是相同的。所有这些对象都来自远程服务,我在保存之前手动将远程对象的 ID 放入实体中。映射如下所示:

@Entity
@Table(name = "FOO")
public class FooDetails {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private long id;

    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name = "customer_id")
    private Customer customer;

    @OneToMany(cascade = CascadeType.ALL)
    @JoinColumn(name = "details_id")
    private Set<Location> locationList;
...
}

@Entity
@Table(name = "CUSTOMER")
public class Customer {

    @Id
    @Column(name = "customer_id", unique = true)
    private long customerId;

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "address_id")
    private Address address;
...
}

@Entity
@Table(name = "LOCATION")
public class Location {

    @Id
    @Column(name = "location_id", unique = true)
    private long locationId;

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "address_id")
    private Address address;
...
}

@Entity
@Table(name = "ADDRESS")
public class Address{

    @Id
    @Column(name = "address_id")
    private long addressId;
    ...

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof StawareAddress)) return false;

        StawareAddress that = (StawareAddress) o;

        return addressId == that.addressId;
    }

    @Override
    public int hashCode() {
        return (int) (addressId ^ (addressId >>> 32));
    }
}

当我从 webservice 收到整个 FooDetails 对象时,我尝试将它保存到本地数据库。

如果数据库是干净的(还没有保存地址),则保存一个来自 WS 的具有正确 id 的地址。如果已经有一个具有此 id 的地址,Hibernate 会尝试将新地址插入数据库,并且由于 addressId 上的唯一约束而出现错误。

我正在使用 Spring Data Jpa 来保存实体(save() 方法)。

我错过了什么明显的实体映射问题?

优点

我实际上不鼓励使用CascadeType.ALLhere并手动处理它。

public void saveFoodetails(FooDetails fooDetails) {
  Address address = addressRepository.find( fooDetails.getAddress().getId() );
  if ( address != null ) {
    // perhaps you update address with data from fooDetails.getAddress()
    addressRepository.save( address );
    // associate attached address instance with fooDetails now.
    fooDetails.setAddress( address );
  }
  else {
    // save the new incoming address contained in FooDetails
    addressRepository.save( fooDetails.getAddress() );
  }
  // now save/update FooDetails
  fooDetailsRepository.save( fooDetails );        
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

多个@ManyToOne字段指向JPA / Hibernate中的同一实体

来自分类Dev

在Hibernate中将多个关联持久化到同一实体

来自分类Dev

Hibernate Search Facet在多个字段上

来自分类Dev

Hibernate Search Facet在多个字段上

来自分类Dev

在Hibernate 4上,如何获取来自select语句的实体的一个字段?

来自分类Dev

从同一实体的内部连接获取 Hibernate 实体

来自分类Dev

从Hibernate到EclipseLink的JPA实体

来自分类Dev

Hibernate / JPA:同一属性上的ManyToMany和OneToMany关系

来自分类Dev

Hibernate:多对多关系表作为实体

来自分类Dev

Hibernate:多对多关系表作为实体

来自分类Dev

Hibernate无法保存实体之间的关系

来自分类Dev

在Hibernate中的表之间指定多个一对多关系

来自分类Dev

在Hibernate中保持一对一关系实体-实体分离

来自分类Dev

实体字段集上的Hibernate NullPointerException(更新)

来自分类Dev

为Hibernate实体的特定字段设置查询

来自分类Dev

Spring + Hibernate:未知实体

来自分类Dev

Hibernate返回错误的实体

来自分类Dev

Springboot Hibernate 实体映射

来自分类Dev

Spring Java Hibernate管理多个实体的save()

来自分类Dev

从Hibernate SQL Join获取多个实体

来自分类Dev

如何从多个实体中获取条件Hibernate

来自分类Dev

Hibernate实体查询到Set <>

来自分类Dev

Hibernate 分离实体传递到持久化

来自分类Dev

在同一模型上具有多个字段名称的has_many关系

来自分类Dev

在Hibernate中映射一对多关系?

来自分类Dev

Hibernate TransientPropertyValueException,同时保留实体ID为0的多对一关系

来自分类Dev

如何使用Hibernate映射调整实体之间的关系?

来自分类Dev

从 Hibernate 中弄清楚实体关系是如何配置的

来自分类Dev

如何在 Hibernate 中将关系表建模为实体

Related 相关文章

  1. 1

    多个@ManyToOne字段指向JPA / Hibernate中的同一实体

  2. 2

    在Hibernate中将多个关联持久化到同一实体

  3. 3

    Hibernate Search Facet在多个字段上

  4. 4

    Hibernate Search Facet在多个字段上

  5. 5

    在Hibernate 4上,如何获取来自select语句的实体的一个字段?

  6. 6

    从同一实体的内部连接获取 Hibernate 实体

  7. 7

    从Hibernate到EclipseLink的JPA实体

  8. 8

    Hibernate / JPA:同一属性上的ManyToMany和OneToMany关系

  9. 9

    Hibernate:多对多关系表作为实体

  10. 10

    Hibernate:多对多关系表作为实体

  11. 11

    Hibernate无法保存实体之间的关系

  12. 12

    在Hibernate中的表之间指定多个一对多关系

  13. 13

    在Hibernate中保持一对一关系实体-实体分离

  14. 14

    实体字段集上的Hibernate NullPointerException(更新)

  15. 15

    为Hibernate实体的特定字段设置查询

  16. 16

    Spring + Hibernate:未知实体

  17. 17

    Hibernate返回错误的实体

  18. 18

    Springboot Hibernate 实体映射

  19. 19

    Spring Java Hibernate管理多个实体的save()

  20. 20

    从Hibernate SQL Join获取多个实体

  21. 21

    如何从多个实体中获取条件Hibernate

  22. 22

    Hibernate实体查询到Set <>

  23. 23

    Hibernate 分离实体传递到持久化

  24. 24

    在同一模型上具有多个字段名称的has_many关系

  25. 25

    在Hibernate中映射一对多关系?

  26. 26

    Hibernate TransientPropertyValueException,同时保留实体ID为0的多对一关系

  27. 27

    如何使用Hibernate映射调整实体之间的关系?

  28. 28

    从 Hibernate 中弄清楚实体关系是如何配置的

  29. 29

    如何在 Hibernate 中将关系表建模为实体

热门标签

归档