2016-12-13 2 views
1

Я обнаружил, что 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 не является тривиальной задачей. (и все ненавидят преобразование данных).

Любые советы очень ценятся.

ответ

0

MariaDB/MySQL handle AUTO_INCREMENT: Числа 1 или больше; 0 - допустимое порядковое число. Если JPA не может жить с этими (и некоторыми другими) ограничениями, JPA нарушается. (Извините, но меня раздражает стороннее программное обеспечение, которое затрудняет жизнь пользователям MySQL.)