Hibernate升级后,将引发PropertyValueException



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

相关内容

  • 没有找到相关文章

最新更新