Я обнаружил, что JPA спящего режима (или mariadb) не работает с 0 значениями во внешнем ключе.JPA foreign key zero 0 value hibernate TransientPropertyValueException
У меня есть родительский класс
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: Not-null property references a transient value - transient instance must be saved before current operation : 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, думая, что это не действительный родительский объект.
Или это действительно проблема мариадба? Связано с тем, что вам нужно изменить настройку сеанса, чтобы вставить 0 в столбцы AUTO_INCREMENT
.
Есть ли какие-либо настройки или аннотации, которые я могу сделать, чтобы сделать эту работу. К сожалению, мы помещаем JPA-код в существующую систему, поэтому изменение значений PARENT_ID
не является тривиальной задачей. (и все ненавидят преобразование данных).
Любые советы очень ценятся.