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

标签 java spring hibernate jpa spring-data-jpa

我有实体 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));
    }
}

当我从网络服务接收到整个 FooDetails 对象时,我尝试将其保存到本地数据库。

如果数据库是干净的(尚未保存地址),则会保存来自 WS 的具有正确 ID 的一个地址。如果已经存在具有该 id 的地址,Hibernate 会尝试将新地址插入数据库,但由于对 addressId 的唯一约束,会出现错误。

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

我错过了哪些明显的实体映射问题?

最佳答案

我实际上不鼓励在这里使用 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 );        
}

关于java - Hibernate - 从多个字段到同一实体的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42707042/

相关文章:

java - Spring Boot 可选的多部分 POST 请求

java - 将作用域 bean Autowiring /注入(inject)到 Controller 方法中

java - 如何使用 key=someBean 的 beanID 、value=someBean 创建映射属性

java hibernate netbeans xml

Java 窗口 "could not find or load main class"

java - 如何检查整个组件是否在屏幕上?

java - 在 JTextArea 中突出显示一个特定的行/行

java - ArrayList 不使用重写的 equals

java - hibernate导入import.sql失败

java - JPA 查询在 tomcat 中的每次循环迭代中变慢