2015-05-05 3 views
1

Мой код с участием 3 объектов:Странное поведение от Hibernate с OneToMany отношений

@Entity 
public class Data implements Serializable { 
    ... 
    @OneToMany(cascade={CascadeType.ALL},fetch = FetchType.EAGER, 
       targetEntity = Bit.class,mappedBy = "data") 
    private Collection<Bit> bit;  

    @OneToMany(cascade={CascadeType.ALL},fetch = FetchType.EAGER, 
       targetEntity = Linked.class,mappedBy = "data") 
    private Collection<Linked> linked; 
} 

@Entity 
public class Linked implements Serializable { 
    ... 
    @EmbeddedId 
    private LinkIdPK id; 

    @ManyToOne(optional=true,fetch = FetchType.EAGER,targetEntity = Data.class) 
    private Data data; 
} 

@Entity 
public class Bit implements Serializable { 
    ... 
    @EmbeddedId 
    private BitIdPK id; 

    @MapsId("data")@ManyToOne(optional=true,targetEntity = Data.class) 
    private Data data; 

Я выполнить поиск с использованием хранилища Spring для того, чтобы получить один экземпляр данных. Я знаю, что элемент, который я запрашиваю из базы данных, имеет элементы «3 бит» и элемент «1 Связанный» в базе данных.

Когда я перехожу через элементы бит в Data.bit, я нахожу 3 элемента, что нормально.

Но когда я перебираю связанные элементы в Data.linked, я нахожу 3 элемента, которые указывают на один и тот же объект, тогда как я ожидал всего 1 элемент.

Я попытался добавить 1 бит элемента в базу данных, и теперь я нахожу 4 элемента в Data.linked, указывая на один и тот же объект.

Это нормальное поведение? Это ошибка в моем коде, или это ошибка в Hibernate?

ответ

0

Наконец, я получил ответ от команды гибернации. Похоже, это известная проблема, и для нее есть только обходной путь: на данный момент: Добавьте аннотацию @Fetch(value = FetchMode.SUBSELECT) в одну из коллекций OneToMany.

0

@MapsID для сопоставления с множеством к одному не привязан к данным. Это может вызвать проблему при использовании встроенного идентификатора.

С уважением,

Прасад

Смежные вопросы