Could not set field value by reflection

19,057

Solution 1

Change the variable Names as below

Long ingredient_id to Long ingredientid nutrional_value_id to nutrionalvalueid

Example

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

to

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

Then generate getter setter for all the fields. Hibernate is unable to set the fields because there is no public getter/setter.

Solution 2

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

Share:
19,057
Francesco
Author by

Francesco

Updated on August 10, 2022

Comments

  • Francesco
    Francesco over 1 year

    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:

    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:

    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.

    class 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.

    {
      "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"
    }
    
  • Francesco
    Francesco over 5 years
    Thanks for the reply. I changed the names of the variables, now I received another error.
  • Francesco
    Francesco over 5 years
    Having used spring data rest the crud operations were generated automatically. the solution proposed to us, however, would oblige me to rewrite the post method. what I would like to do is insert this table directly from the rest call. @Roshini
  • Mat
    Mat almost 3 years
    This is what I had to do. I was populating my equivalent of "ingredient" and "nutrionalValue", and getting the "Could not set field..." exception when saving. Doing the above fixed the issue for me.