当前位置: 首页 > 知识库问答 >
问题:

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

微生毅然
2023-03-14

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

碰巧在客户中的地址和在位置中的地址是相同的。所有这些对象都来自远程服务,在保存之前,我手动将远程对象的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));
    }
}

共有1个答案

谢阳成
2023-03-14

实际上,我不希望在这里使用cascadetype.all并手动处理它。

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 );        
}
 类似资料:
  • 问题内容: 我有一个具有和的实体。我也有一个实体。我试图使单个地址表同时包含送货地址和帐单地址,因为没有什么区别它们,并且在一个或多个订单中帐单地址和送货地址可以相同。我已经在中使用了地址字段,但是我不确定使这种双向传输正确的方法。 我有两个问题: 是否适合地址字段,因为它实际上是n:2关系,我只是使用两个单独的字段来表示?如果没有,我该怎么办? 假设1.可以,那么如何使映射双向化(在实体中应使用

  • 当我映射同一个实体时,就像这里回答的那样: Hibernate与同一实体的多对多关联 在“tbl_friends”表中,我有相同含义的行。例如,我有id=1的用户和id=2的用户。在“tbl_friends”表中,当他们作为朋友链接时,我有两行 使用Hibernate或JPA引用是否可以在一行(1-2或2-1)中建立这种关系?

  • 问题内容: 另一个hibernate问题…:P 使用Hibernate的Annotations框架,我有一个实体。每个人都可以有一个朋友的集合:其他的集合。但是,我还无法弄清楚如何在由s 列表组成的类中创建多对多关联(使用用户友好中间表)。 这是User类及其注释: 用户- 朋友映射表只有两列,这两列都是该表列的外键。两列是(应映射到当前用户)和(指定当前用户的朋友的ID)。 问题是,即使我已经预

  • 首先,我已经阅读了Hibernate——一个包含多个实体的表?。 然而,我希望将两个实体映射到同一个表,但我希望它们都是实体,我可以从中选择。我的意思是: 一个表:人(id、姓名、出生日期、城市、街道、邮政编码)。 两个实体:人(id、name、dateOfBirth)、地址(id、城市、街道、邮政编码)。 实体之间是1:1的关系,但数据库中仍然是1个表。 如果我在上面的链接中使用建议的解决方案(

  • 我创建了一个“文档”实体: 例如 多个文档可以与不同的实体类型相关:post、userProfile等 例如,在发布实体中,我有几个字段,它们都指定文档关系。 我不清楚如何使文档关系双向。我曾希望在文档上有一个字段,如: 这样,如果我查询文档实体的父关系,我会得到如下结果: 但是Typeorm似乎想让我为文件实体上的每个父关系字段定义一个精确的匹配字段,比如: 为了简单起见,本例中没有M:N关系:

  • DBSchema-2表(用户和角色)具有多对多关系,并由postgres中的中间表(用户角色)桥接。我想获取所有角色和创建它的人的姓名。名称在用户表中可用,但所有其他详细信息在角色表中。Roles表中有一个由创建人(创建角色的人的用户id)创建的字段。 我正在尝试构建一个GET请求,以查看给定id的所有角色以及创建id的人的姓名 实体类Users1.java 实体类角色。JAVA 角色。存储库类