在Hibernate升级4.3.11.最终到5.0.12.最终我的测试开始失败:
org.hibernate.PropertyValueException: not-null property references a null or transient value : com.mypackage.universal.model.MySetting.myOperation
在尝试保存MySetting而不保存myOperation字段后抛出。但是,myOperationField的可选和可为Null设置为true。
请参阅以下代码:
@Entity
@Table(name = "my_Settings")
public class MySetting {
@Id
private Long id;
@ManyToOne(optional = true, fetch = FetchType.LAZY)
@JoinColumn(name = "my_Operation_id", nullable = true)
private MyOperation myOperation;
@Column
private String key;
@Column
private String value;
}
想要保存MySetting:的片段
MySetting setting = new MySetting((Long) 1L, (String) myKey, (String) myValue);
session.save(setting);
MySetting构造函数:
public MySetting(Long id, String key, String value) {
this.id = id;
setKey(key);
setValue(value);
}
我知道我可以禁用空检查:
<prop key="hibernate.check_nullability">false</prop>
但这违反了干净的代码,并将使处理实体变得更加困难。我已经检查过这个bug,在5.1.17上也存在。Hibernate的最终版本。
你知道这里发生了什么吗?在4.3.11.最终版本中,这一点没有任何问题。。
由于某种原因,根本原因是MyOperationEnity的实现。我不完全理解为什么,但在将错误使用的@ElementCollection更改为@OneToMany后,它开始工作。如果有人知道错误出现的确切原因,请告诉我。
之前:
@ElementCollection(fetch = FetchType.LAZY)
@CollectionTable(name = "my_settings", joinColumns = @JoinColumn(name = "my_operation_id"))
@MapKeyColumn(name = "key")
@Column(name = "value")
private List<MySetting> mySettings;
之后:
@OneToMany(fetch = FetchType.LAZY, mappedBy = "myOperation")
private List<MySetting> mySettings;