Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果@IdClass包含来自其他实体的外键,则无法获取@GeneratedValue以使用它_Java_Spring_Spring Boot_Hibernate_Jpa - Fatal编程技术网

Java 如果@IdClass包含来自其他实体的外键,则无法获取@GeneratedValue以使用它

Java 如果@IdClass包含来自其他实体的外键,则无法获取@GeneratedValue以使用它,java,spring,spring-boot,hibernate,jpa,Java,Spring,Spring Boot,Hibernate,Jpa,如果@IdClass包含来自另一个实体的外键,我无法让@GeneratedValue与它一起工作 所以我有一个选项实体,看起来像这样 @Data @AllArgsConstructor @NoArgsConstructor public class OptionValueId implements Serializable { @Column(name = "option_value_id") private Long optionValueId; @

如果@IdClass包含来自另一个实体的外键,我无法让@GeneratedValue与它一起工作

所以我有一个选项实体,看起来像这样

@Data
@AllArgsConstructor
@NoArgsConstructor
public class OptionValueId implements Serializable {
    @Column(name = "option_value_id")
    private Long optionValueId;
    @Column(name = "option_id")
    private Long option;
}
@数据
@诺尔格构装师
@AllArgsConstructor
@EqualsAndHashCode(callSuper=true)
@实体
@表(name=“options”)
公共类选项扩展了UserDateAudit{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
@列(name=“option\u id”)
私人长期权ID;
@不空白
@列(nullable=false)
私有字符串名称;
//具有optionValues实体的一对多
@OneToMany(mappedBy=“option”,cascade=CascadeType.ALL,fetch=FetchType.LAZY,orphan=true)
私有设置选项值;
@OneToMany(mappedBy=“option”,cascade=CascadeType.ALL,fetch=FetchType.LAZY)
私人集合期权产品;
}
和OptionValue实体

@数据
@诺尔格构装师
@AllArgsConstructor
@EqualsAndHashCode(callSuper=true)
@实体
@表(name=“option\u值”)
@IdClass(OptionValueId.class)
公共类OptionValue扩展UserDateAudit{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
@列(name=“option\u value\u id”)
私人长期期权ValueId;
@不空白
@列(nullable=false)
私有字符串valueName;
@身份证
@manytone(fetch=FetchType.LAZY)
@JoinColumn(name=“option\u id”,referencedColumnName=“option\u id”)
私人选择权;
@OneToMany(mappedBy=“optionValue”,cascade=CascadeType.ALL,fetch=FetchType.LAZY)
私有集变量值;
}
@资料
@AllArgsConstructor
@诺尔格构装师
公共类OptionValueId实现可序列化{
私人长期期权ValueId;
私人选择权;
}
我试着保存它

public ResponseEntity创建(长optionId,OptionValueCreateDto OptionValueCreateDto){
Option=optionRepository.findById(optionId.orelsetrow)(
()->新EntityNotFoundException(“errors.option.notFound”)
);
OptionValue OptionValue=ObjectMapperUtils.map(optionValueCreateDto,OptionValue.class);
optionValue.setOption(选项);
optionValue=optionValueRepository.save(optionValue);
返回新的响应属性(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]
我不知道这里出了什么问题

我也试着让我的课堂变成这样

@Data
@AllArgsConstructor
@NoArgsConstructor
public class OptionValueId implements Serializable {
    @Column(name = "option_value_id")
    private Long optionValueId;
    @Column(name = "option_id")
    private Long option;
}
但它并没有起到很好的作用,并显示出类似的例外

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]
编辑1 事实证明它必须是一个复合键,因为这个复合键在另一个表中使用,这导致了许多问题,无法删除复合键提供的验证


也许我应该首先澄清这一点。

异常与Spring数据或WebMvc无法转换值有关。将生成的标识符与其他标识符混合在一起实际上是不可能的。为什么您需要这两个值呢?在这里使用复合id毫无意义。只要用这个:

@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;

}
@数据
@诺尔格构装师
@AllArgsConstructor
@EqualsAndHashCode(callSuper=true)
@实体
@表(name=“option\u值”)
@IdClass(OptionValueId.class)
公共类OptionValue扩展UserDateAudit{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
@列(name=“option\u value\u id”)
私人长期期权ValueId;
@不空白
@列(nullable=false)
私有字符串valueName;
@manytone(fetch=FetchType.LAZY)
@JoinColumn(name=“option\u id”,referencedColumnName=“option\u id”)
私人选择权;
@OneToMany(mappedBy=“optionValue”,cascade=CascadeType.ALL,fetch=FetchType.LAZY)
私有集变量值;
}

下面是我所做的全部解释

选项
类保持不变

但是更新了
选项值

1-期权价值实体

package com.ecommerce.product.model;
导入com.ecommerce.product.model.helper.OptionValueId;
导入lombok.allargsconstuctor;
导入龙目数据;
导入lombok.noargsconstuctor;
导入javax.persistence.*;
导入javax.validation.constraints.NotBlank;
导入javax.validation.constraints.NotNull;
导入java.io.Serializable;
导入java.util.Set;
@资料
@诺尔格构装师
@AllArgsConstructor
@实体
@表(name=“option\u值”)
@IdClass(OptionValueId.class)
@SequenceGenerator(name=“OPTION\u VALUE”,sequenceName=“OPTION\u VALUE\u GENERATOR”)
公共类OptionValue实现可序列化{
私有静态最终长serialVersionUID=-1L;
@身份证
@GeneratedValue(策略=GenerationType.SEQUENCE,generator=“OPTION_VALUE”)
@列(name=“option\u value\u id”)
私人长期期权ValueId;
@身份证
@列(name=“option\u id”)
私人长期权ID;
@不空白
@列(nullable=false)
私有字符串valueName;
@manytone(fetch=FetchType.LAZY,cascade=CascadeType.ALL)
@JoinColumn(name=“option\u id”,insertable=false,updateable=false)
@NotNull
私人选择权;
@OneToMany(mappedBy=“optionValue”,cascade=CascadeType.ALL,fetch=FetchType.LAZY)
私有集变量值;
}
这里的区别在于
@GeneratedValue()
中的差异。使用复合键时,使用
GenerationType.IDENTITY
无效。必须使用
GenerationType.SEQUENCE
才能正常工作。 在这种情况下,提供一个生成器可以避免hibernate使用其全局生成器,该全局生成器将使用
SEQUENCE
generator与所有实体共享

@SequenceGenerator(name=“OPTION\u VALUE”,sequenceName=“OPTION\u VALUE\u genr