По устаревшим причинам у меня есть составные ключи в моей базе данных, я использую @IdClass для их отображения (до того, как я использовал @Embeddedid, но у него были свои ошибки).Однако у меня возникает проблема всякий раз, когда я пытаюсь сохранить объект составного ключа, который содержит прокси, как поле идентификатора.Я сделал очень простой пример, чтобы изолировать эту проблему (пример использует Spring Data, но я думаю, что это не имеет значения).PS Я знаю, что вызов .save не является необходимым, но он не должен вызывать исключения.
@Entity
public class Image {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String fileName;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
}
@Entity
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
@Entity
@IdClass(ProductImage.ProductImageId.class)
public class ProductImage {
public static class ProductImageId implements Serializable {
private static final long serialVersionUID = 8542391285589067304L;
private Long product;
private Long image;
public ProductImageId() {
}
public Long getProduct() {
return product;
}
public void setProduct(Long product) {
this.product = product;
}
public Long getImage() {
return image;
}
public void setImage(Long image) {
this.image = image;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
ProductImageId that = (ProductImageId) o;
return Objects.equals(product, that.product) &&
Objects.equals(image, that.image);
}
@Override
public int hashCode() {
return Objects.hash(product, image);
}
}
@ManyToOne(fetch = FetchType.LAZY)
@Id
private Product product;
@ManyToOne(fetch = FetchType.LAZY)
@Id
private Image image;
private Integer number;
public Product getProduct() {
return product;
}
public void setProduct(Product product) {
this.product = product;
}
public Image getImage() {
return image;
}
public void setImage(Image image) {
this.image = image;
}
public Integer getNumber() {
return number;
}
public void setNumber(Integer number) {
this.number = number;
}
}
List<ProductImage> productImages = productImageRepository.findAll();
productImages.get(0).setNumber(456);
productImageRepository.save(productImages.get(0));
Причина: java.lang.IllegalArgumentException: Невозможно преобразовать значение типа 'com.example.springbootnewplayground.Product $ HibernateProxy $ AJ38NiN6' в обязательный тип 'java.lang.Long' для свойства 'product': PropertyEditor [org.springframework.beans.propertyedditorNumber.Core]возвратил недопустимое значение типа 'com.example.springbootnewplayground.Product $ HibernateProxy $ AJ38NiN6' в org.springframework.beans.TypeConverterDelegate.convertIfNeeded (TypeConverterDelegate.java:258) ~ [spring-beans-5.1.6.ar:С1010 *