我不喜欢多对多的关系。这些表格是:成分和营养价值。我创建了两个实体之间的关系表,其中有成分和营养值的外部键(形成复合键)和一些属性。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;
}
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);
}
}
当我试图在关系表中插入一个新字段时,我得到了这个错误:
{
"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"
}
编辑:我添加了构造函数和注解@Getter
和@Setter
,但我有同样的错误。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>();
}
编辑: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"
}
5条答案
按热度按时间gudnpqoy1#
在
JoinedNutrionalValueIngredient
类中,复合idNutrionalValueIngredientId
应被示例化。roejwanj2#
如下所示更改变量Names
长成分ID到长成分ID nutrional_value_id到nutrionalvalueid
例如
到
然后为所有字段生成getter setter。Hibernate无法设置字段,因为没有公共getter/setter。
pvcm50d13#
设置id实体“NutrionalValueDientId”的值,然后尝试将其作为“JoinedNutrionalValueDient”的嵌入id插入。参考以下示例:
参考上面的嵌入式ID类(Embedded Id)。这是Employee类的主键。因此,我们需要在ID class中设置值(ID ID)然后,将ID class注入到Employee作为主键。然后它会工作。如果没有主键,则该值为null。
设置ID类和其他字段的值,如下所示。
hc2pp10m4#
检查您是否正在为嵌入式ID设置示例。我没有得到这个错误。
我改变这个
到
qrjkbowd5#
在我的例子中,发生的事情是,我试图持久化一个实体,该实体的组成ID带有一个空字段(因为错误说“为...生成了空ID”)。在你的例子中,我试图持久化一个这样的对象(参见
ing
):在我的例子中,这个错误来自错误的DTO转换。为了解决这个问题,我简单地改变了逻辑,在持久化之前将这个字段设置为它的值。