简体   繁体   English

无法通过反射设置字段值

[英]Could not set field value by reflection

I have a problem with a many to many relationship.我有一个多对多关系的问题。 The tables are: ingredient and nutional value.这些表格是:成分和营养价值。 I created a table of relations between the 2 entities, in which there are the external keys of ingredient and nutrional value (which form the compound key) and some attributes.我创建了两个实体之间的关系表,其中有成分和营养价值的外部键(形成复合键)和一些属性。

Class JoinedNutrionalValueIngredient :JoinedNutrionalValueIngredient

import lombok.Data;
import javax.persistence.*;
import javax.validation.constraints.NotNull;
import java.io.Serializable;

@Entity @Data
public class JoinedNutrionalValueIngredient implements Serializable {

    @EmbeddedId
    private NutrionalValueIngredientId id;

    @ManyToOne(fetch= FetchType.LAZY)
    @MapsId("ingredient_id")
    private Ingredient ingredient;

    @ManyToOne(fetch=FetchType.LAZY)
    @MapsId("nutrional_value_id")
    private NutrionalValue nutrionalValue;

    @NotNull
    String matrixUnit;

    @NotNull
    int value;

    @NotNull
    String valueType;
}

Class NutrionalValueIngredientId :NutrionalValueIngredientId

import javax.persistence.*;
import java.io.Serializable;
import java.util.Objects;

@Embeddable
@Getter
@Setter
public class NutrionalValueIngredientId implements Serializable{

    @Column(name = "ingredient_id")
    private Long ingredient_id;

    @Column(name = "nutrional_value_id")
    private Long nutrional_value_id;

    public NutrionalValueIngredientId() {
        
    }   
   
    public NutrionalValueIngredientId(Long ingredient, Long nutrionalValue){
        this.ingredient_id=ingredient;
        this.nutrional_value_id=nutrionalValue;
    }
    
    public boolean equals(Object o) {
        if (this == o) return true;
    
        if (o == null || getClass() != o.getClass())
            return false;
    
        NutrionalValueIngredientId that = (NutrionalValueIngredientId) o;
        return Objects.equals(ingredient_id, that.ingredient_id) &&
                    Objects.equals(nutrional_value_id, that.nutrional_value_id);
    }
    
    @Override
    public int hashCode() {
        return Objects.hash(ingredient_id, nutrional_value_id);
    }
}

When I try to insert a new field inside the relationship table I get this error:当我尝试在关系表中插入一个新字段时,出现此错误:

{
  "timestamp": 1542653896247,
  "status": 500,
  "error": "Internal Server Error",
  "message": "Could not set field value [1] value by reflection : [class com.whateat.reciper.model.NutrionalValueIngredientId.ingredient_id] setter of com.whateat.reciper.model.NutrionalValueIngredientId.ingredient_id; nested exception is org.hibernate.PropertyAccessException: Could not set field value [1] value by reflection : [class com.whateat.reciper.model.NutrionalValueIngredientId.ingredient_id] setter of com.whateat.reciper.model.NutrionalValueIngredientId.ingredient_id",
  "path": "/v1/joinedNutrionalValueIngredients"
}

Edit: I added constructor and annotation @Getter and @Setter , but I have the same error.编辑:我添加了构造函数和注释@Getter@Setter ,但我有同样的错误。

class NutritionalValue : NutritionalValue类:

@Data
@Entity
public class NutrionalValue implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @NotNull
    private String name;

    @NotNull
    private String unit;

    @NotNull
    private String source;

    @ManyToOne
    @NotNull
    @JoinColumn(name = "category_id")
    private NutrionalValueCategory category;

    @OneToMany(mappedBy = "nutrionalValue")
    private Set<JoinedNutrionalValueIngredient> joined = new HashSet<JoinedNutrionalValueIngredient>();

}

edit: after Debopam's answer, this error came out.编辑:在 Debopam 的回答之后,这个错误就出来了。

{
  "timestamp": 1542657216244,
  "status": 500,
  "error": "Internal Server Error",
  "message": "null id generated for:class com.whateat.reciper.model.JoinedNutrionalValueIngredient; nested exception is org.hibernate.id.IdentifierGenerationException: null id generated for:class com.whateat.reciper.model.JoinedNutrionalValueIngredient",
  "path": "/v1/joinedNutrionalValueIngredients"
}

Change the variable Names as below更改变量名称如下

Long ingredient_id to Long ingredientid nutrional_value_id to nutrionalvalueid长成分_id到长成分id nutrional_value_id到nutrionalvalueid

Example例子

  @Column(name = "ingredient_id")
  Long ingredient_id;

to

@Column(name = "ingredient_id")
Long ingredientid;

Then generate getter setter for all the fields.然后为所有字段生成 getter setter。 Hibernate is unable to set the fields because there is no public getter/setter. Hibernate 无法设置字段,因为没有公共 getter/setter。

 @Entity @Data
 public class JoinedNutrionalValueIngredient implements Serializable {
    
        @EmbeddedId
        private NutrionalValueIngredientId id = new NutrionalValueIngredientId();
    
    // ... rest of class  
 }

In the JoinedNutrionalValueIngredient class the compound id NutrionalValueIngredientId shall be instansiated.JoinedNutrionalValueIngredient类中,复合 id NutrionalValueIngredientId应该被实例化。

Set values for the the id entity 'NutrionalValueIngredientId ' then try to insert that as embedded id for 'JoinedNutrionalValueIngredient'.为 id 实体“NutrionalValueIngredientId”设置值,然后尝试将其作为“JoinedNutrionalValueIngredient”的嵌入 id 插入。 refer below example:参考下面的例子:

package com.example;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Embeddable;

@Embeddable
public class EmployeeId implements Serializable
{
private static final long serialVersionUID = 1L;
@Column(name = "EMP_ID")
private int empId;
@Column(name = "DEPARTMENT")
private String department;

public EmployeeId()
{
    super();
}
public EmployeeId(int empId, String department)
{
    super();
    this.empId = empId;
    this.department = department;
}

public int getEmpId()
{
    return empId;
}
public void setEmpId(int empId)
{
    this.empId = empId;
}
public String getDepartment()
{
    return department;
}
public void setDepartment(String department)
{
    this.department = department;
}
@Override
public int hashCode()
{
    final int prime = 31;
    int result = 1;
    result = prime * result + ((department == null) ? 0 : department.hashCode());
    result = prime * result + empId;
    return result;
}
@Override
public boolean equals(Object obj)
{
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    EmployeeId other = (EmployeeId) obj;
    if (department == null)
    {
        if (other.department != null)
            return false;
    } else if (!department.equals(other.department))
        return false;
    if (empId != other.empId)
        return false;
    return true;
}
 }

Refer above Embedded Id class(EmployeeId).请参阅上面的嵌入式 ID 类(EmployeeId)。 which is primary key of Employee class.这是 Employee 类的主键。 So, We need to set the values in Id class(EmployeeId) Then, inject that id class to Employee as primary key.因此,我们需要在 Id 类(EmployeeId)中设置值,然后将该 id 类作为主键注入到 Employee 中。 Then it will work.然后它会起作用。 Without primary key that value is null.如果没有主键,该值为空。

package com.example;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class Employee implements Serializable
{
private static final long serialVersionUID = 1L;
@EmbeddedId
EmployeeId id;
@Column(name="EMP_NAME")
private String empName;

public Employee()
{
    super();
}
public Employee(EmployeeId id, String empName)
{
    super();
    this.id = id;
    this.empName = empName;
}
public EmployeeId getId()
{
    return id;
}
public void setId(EmployeeId id)
{
    this.id = id;
}
public String getEmpName()
{
    return empName;
}
public void setEmpName(String empName)
{
    this.empName = empName;
}
} 

Set Values for Id class and other field like below.为 Id 类和其他字段设置值,如下所示。

 //Create a new Employee object   
 Employee employee = new Employee();

 EmployeeId employeeId = new EmployeeId(1,"DailyNews");
 employee.setEmpName("CompositeKey");
 employee.setId(employeeId);

 session.save(employee);

Check you are setting the instance for embedded id.检查您是否正在为嵌入式 ID 设置实例。 I was not and getting this error.我不是并收到此错误。

I change this我改变这个

@EmbeddedId
ProductUserId id;    

ProductUser(Integer productId, Integer UserId, Double rating){
    this.rating = rating
}

to

@EmbeddedId
ProductUserId id;    

ProductUser(Integer productId, Integer userId, Double rating){
    this.id = new ProductUserId(productId, userId);
    this.rating = rating
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM