2013-11-18 1 views
2

У меня есть отношения двунаправленной @OneToMany/@ManyToOne в нижеследующих лиц:org.hibernate.AssertionFailure: нулевой идентификатор в Hibernate @OneToMany отношений

@Entity 
public class Item implements java.io.Serializable { 

    // other columns including ID 
@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private Long itemId; 

    @ManyToOne(fetch = FetchType.EAGER) 
    @JoinColumn(name = "packageId") 
    private Package package;   
} 

@Entity 
public class Package { 

    // other columns including ID 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 

    @OneToMany(fetch = FetchType.EAGER, mappedBy="package", cascade = CascadeType.ALL) 
    private Set<Item> items = new HashSet<Item>(0); 
}  

Предположим сначала, что есть пакет без предметов и добавлять элементы к этому пакету, когда я пытаюсь получить пакет по его идентификатору packageRepository.findOne(packageId) (код JPA Spring Data), я получаю следующую ошибку в этой строке.

org.hibernate.AssertionFailure: null identifier 
    at org.hibernate.engine.spi.EntityKey.<init>(EntityKey.java:69) 
    at org.hibernate.internal.AbstractSessionImpl.generateEntityKey(AbstractSessionImpl.java:247) 
    at org.hibernate.loader.Loader.extractKeysFromResultSet(Loader.java:794) 
    at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:707) 

Я думаю, что Hibernate пытается левая внешним соединением и обнаруживает, что Itemid (Id для Item лиц) является недействительным. Мне нужно получить EAGER. Каков обходной путь для этой проблемы? Как получить пакет, когда нет элементов?

+0

Не могли бы вы опубликовать поля ID в классах? –

+0

Я предполагаю, что либо неправильное сопоставление идентификатора, либо наличие в базе данных нулевого идентификатора. Чтобы узнать, что такое SQL-запрос, включите SQL-журнал и посмотрите сами. –

+0

@JBNizet Добавлены поля идентификаторов. Во время извлечения пакета нет элементов в таблице. Таким образом, левое внешнее соединение пакета с элементом (из журнала SQL) приводит к null 'itemId'. – Swapnil

ответ

0

Используйте @NotFound аннотация:

@OneToMany(fetch = FetchType.EAGER, mappedBy="package", cascade = CascadeType.ALL) 
@NotFound(action=NotFoundAction.IGNORE) 
private Set<Item> items = new HashSet<Item>(0); 

Это не может быть лучшим лекарством от вашей проблемы. Hibernate документы описывают использование @NotFound как:

Когда спящий режим не может разрешить ассоциацию, поскольку ожидаемый связанный с ним элемент не находится в базе данных (неправильный идентификатор на колонке ассоциации ), возникает исключение. Это может быть неудобно для устаревших и плохо поддерживаемых схем. Вы можете попросить Hibernate игнорировать такие элементы вместо того, чтобы поднимать исключение, используя аннотацию @NotFound .

+0

Спасибо, еще не пробовал. Но я не понимаю - «для устаревших и плохо поддерживаемых схем». Я думал, что мой прецедент очень распространен. Наличие отношения «один ко многим» с исходным пакетом без элементов. Есть ли что-то очевидное, что мне не хватает? – Swapnil

+0

Я думаю, что ваш случай довольно распространен и не может точно сказать, почему он терпит неудачу. Я только начал думать: может быть, когда элементы LEFT JOINed в запросе, hibernate пытается загрузить связанный пакет (но почему?), Который явно имеет нулевой идентификатор, и это на самом деле то, что не удается? – heikkim

+0

В LEFT JOIN пакета к элементу 'itemId' выходит как Null, потому что нет никаких элементов, связанных с этим пакетом. Но не уверен, как обойти это. – Swapnil