Проблема с прокси при использовании @IdClass в Hibernate - PullRequest
0 голосов
/ 12 апреля 2019

По устаревшим причинам у меня есть составные ключи в моей базе данных, я использую @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 *

...