मुझे @IdClass के साथ काम करने के लिए @GeneratedValue नहीं मिल सकता है यदि इसमें किसी अन्य इकाई की विदेशी कुंजी शामिल है।

तो मेरे पास एक विकल्प इकाई है जो इस तरह दिखती है

   @Data
   @NoArgsConstructor
   @AllArgsConstructor
   @EqualsAndHashCode(callSuper = true)
   @Entity
   @Table(name = "options")
   public class Option extends UserDateAudit {
   
       @Id
       @GeneratedValue(strategy = GenerationType.IDENTITY)
       @Column(name = "option_id")
       private Long optionId;
   
       @NotBlank
       @Column(nullable = false)
       private String name;
   
       //one to many with optionValues entity
       @OneToMany(mappedBy = "option", cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)
       private Set<OptionValue> optionValues;
   
       @OneToMany(mappedBy = "option", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
       private Set<ProductOption> optionProducts;
   
   }

और एक OptionValue इकाई

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @EqualsAndHashCode(callSuper = true)
    @Entity
    @Table(name = "option_values")
    @IdClass(OptionValueId.class)
    public class OptionValue extends UserDateAudit {
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name = "option_value_id")
        private Long optionValueId;
    
        @NotBlank
        @Column(nullable = false)
        private String valueName;
    
        @Id
        @ManyToOne(fetch = FetchType.LAZY)
        @JoinColumn(name = "option_id", referencedColumnName = "option_id")
        private Option option;
    
        @OneToMany(mappedBy = "optionValue", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
        private Set<VariantValue> variantValues;
    
    }
    
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class OptionValueId implements Serializable {
        private Long optionValueId;
        private Option option;
    }

और मैं इसे बचाने की कोशिश करता हूं

    public ResponseEntity<OptionValue> create(Long optionId, OptionValueCreateDto optionValueCreateDto) {
            Option option = optionRepository.findById(optionId).orElseThrow(
                    () -> new EntityNotFoundException("errors.option.notFound")
            );
            OptionValue optionValue = ObjectMapperUtils.map(optionValueCreateDto, OptionValue.class);
            optionValue.setOption(option);
            optionValue = optionValueRepository.save(optionValue);
            return new ResponseEntity<>(optionValue, HttpStatus.CREATED);
        }

लेकिन मुझे निम्नलिखित अपवाद मिलता है:

Resolved [org.springframework.beans.ConversionNotSupportedException: Failed to convert property value of type 'java.lang.Long' to required type 'com.ecommerce.product.model.Option' for property 'option'; nested exception is java.lang.IllegalStateException: Cannot convert value of type 'java.lang.Long' to required type 'com.ecommerce.product.model.Option' for property 'option': no matching editors or conversion strategy found]

और मैं यह नहीं समझ सकता कि यहाँ क्या गलत है

मैंने अपना IdClass इस तरह बनाने की भी कोशिश की

@Data
@AllArgsConstructor
@NoArgsConstructor
public class OptionValueId implements Serializable {
    @Column(name = "option_value_id")
    private Long optionValueId;
    @Column(name = "option_id")
    private Long option;
}

लेकिन यह भी काम नहीं किया और एक समान अपवाद दिखाया

1 संपादित करें यह पता चला है कि इसे एक कंपाउंड कुंजी होना चाहिए क्योंकि यह कंपाउंड कुंजी किसी अन्य तालिका में उपयोग की जाती है, जिससे कंपाउंड कुंजी प्रदान करने वाले सत्यापन को हटाने के लिए बहुत सारी समस्याएं होती हैं।

शायद मुझे पहले ही यह स्पष्ट कर देना चाहिए था।

0
Omar Abdelhady 1 पद 2020, 11:24

1 उत्तर

अपवाद स्प्रिंग डेटा या वेबएमवीसी से संबंधित है जो मूल्यों को परिवर्तित करने में सक्षम नहीं है। उत्पन्न पहचानकर्ताओं को अन्य पहचानकर्ताओं के साथ मिलाना वास्तव में संभव नहीं है। वैसे भी आपको दोनों मूल्यों की आवश्यकता क्यों है? आईएमओ को यहां एक समग्र आईडी रखने का कोई मतलब नहीं है। बस इसका इस्तेमाल करें:

@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
@Entity
@Table(name = "option_values")
@IdClass(OptionValueId.class)
public class OptionValue extends UserDateAudit {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "option_value_id")
    private Long optionValueId;

    @NotBlank
    @Column(nullable = false)
    private String valueName;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "option_id", referencedColumnName = "option_id")
    private Option option;

    @OneToMany(mappedBy = "optionValue", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private Set<VariantValue> variantValues;

}
1
Christian Beikov 1 पद 2020, 11:51