簡體   English   中英

休眠-從多個字段到同一實體的關系

[英]Hibernate - relationship from multiple fields to same entity

我有實體FooDetails,它具有兩個字段:客戶和位置列表。 客戶具有地址(@OneToOne單向映射),而位置也具有具有@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));
    }
}

當我從Web服務接收整個FooDetails對象時,我嘗試將其保存到本地數據庫。

如果數據庫是干凈的(尚未保存地址),則會保存一個來自WS且具有正確ID的地址。 如果已經有一個具有此ID的地址,則Hibernate會嘗試將新的ID插入數據庫,並且由於對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 );        
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM