JPA外键0 0值hibernate TransientPropertyValueException

时间:2016-12-13 05:21:16

标签: java hibernate jpa mariadb

我发现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=0parent_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值并非易事。 (而且每个人都讨厌数据转换)。

非常感谢任何提示。

1 个答案:

答案 0 :(得分:0)

MariaDB / MySQL句柄AUTO_INCREMENT因此:数字为1或更大; 0是有效的序列号。如果JPA无法忍受那些(以及其他一些)限制,JPA就会被破坏。 (抱歉,我对第三方软件感到恼火,这使得MySQL用户的生活变得困难。)