我发现hibernate(或mariadb)JPA似乎不能在外键中使用0值。
我有一个父类
class Parent {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "PARENT_ID", unique = true, nullable = false)
private Integer parentId;
}
和一个儿童班
class Child {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "CHILD_ID", unique = true, nullable = false)
private Integer childId;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "PARENT_ID", nullable = false)
private Parent parent;
}
所以我们父母有2行。 parent_id=0
和parent_id=1
我的问题是我在尝试使用ID为0的父项时出错。即此代码
Parent p = entityManager.find(Parent.class, new Integer(0));
Child c = new Child();
c.setParent(p);
entityManager.persist(c);
将失败并显示错误:
java.lang.IllegalStateException: org.hibernate.TransientPropertyValueException:非null属性 引用瞬态值 - 必须先保存瞬态实例 当前操作:com.whatever.Child.parent - > com.whatever.Parent
但以下工作正常:
Parent p = entityManager.find(Parent.class, new Integer(1));
Child c = new Child();
c.setParent(p);
entityManager.persist(c);
所以我假设PARENT_ID=0
让JPA认为它不是一个有效的父对象。
或者这实际上是一个mariadb问题?与您必须更改会话设置以将0插入AUTO_INCREMENT
列的事实相关。
我可以做任何配置或注释来完成这项工作。不幸的是,我们将JPA代码放在现有系统上,因此更改PARENT_ID
值并非易事。 (而且每个人都讨厌数据转换)。
非常感谢任何提示。
答案 0 :(得分:0)
MariaDB / MySQL句柄AUTO_INCREMENT
因此:数字为1或更大; 0是有效的序列号。如果JPA无法忍受那些(以及其他一些)限制,JPA就会被破坏。 (抱歉,我对第三方软件感到恼火,这使得MySQL用户的生活变得困难。)