Сохранение LinkedList в Hibernate - PullRequest
2 голосов
/ 23 января 2012

Я пытаюсь сохранить класс с атрибутом LinkedList, но, похоже, не могу сделать это правильно.Вот мой код и мое отображение:

 import java.util.LinkedList;
 public class Stuff implements java.io.Serializable {
    private long id;
private LinkedList<Image> images;


public Stuff() {
}


public Stuff(long Id) {
    id = Id;
}

public long getId() {
    return id;
}

public void setId(long mealId) {
    id = mealId;
}


public LinkedList<Image> getNumberImages(int number) {
    assert (number >= 0);
    return (LinkedList<Image>) images.subList(0, number) ;
}

public LinkedList<Image> getImages() {
    return images;
}
    public LinkedList<Image> setImages(LinkedList<Image> images) {
    this.images = images;
}


public void addImage(Image image) {
    if (!images.contains(image)) {
        images.add(image);
    }
}

Отображение в спящем режиме:

<hibernate-mapping>
    <class name="data.Stuff" table="Stuff">
        <id name="id" type="long" access="field">
            <column name="ID" />
            <generator class="assigned" />
        </id>
        <list name="images" inverse="false" table="IMAGE" lazy="true" access="field">
            <key>
                <column name="ID" />
            </key>
            <list-index></list-index>
            <one-to-many class="data.Image" />
        </list>
    </class>
</hibernate-mapping>

Кажется, что я могу сохранять объекты Class Stuff следующим образом, но когда я пытаюсь восстановить их, следующеепроисходит ошибка:

Hibernate: select stuff0_.ID as ID0_, stuff0_.NAME as NAME0_, meal0_.GROUPING as GROUPING0_ from MEAL meal0_
org.hibernate.PropertyAccessException: could not set a field value by reflection setter of data.Meal.images

Ответы [ 2 ]

9 голосов
/ 23 января 2012

Как правило, Hibernate предоставляет свои собственные реализации для коллекций, поэтому вам следует отдавать предпочтение интерфейсам для конкретных реализаций. Вероятно, он пытается назначить другой вид списка для изображений и не удается. Вы должны изменить свое поле на List<Image>.

6 голосов
/ 23 января 2012

Hibernate (и JPA в целом) сохраняет коллекции, используя их интерфейсы.Список должен быть объявлен как List, а не как LinkedList.И он не будет загружен экземпляром LinkedList, потому что Hibernate использует собственную реализацию List для реализации грязной проверки, отложенной загрузки и т. Д.

Хорошей практикой является программирование на интерфейсах.чем программирование на конкретных реализациях в целом.В субъектах JPA это обязательно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...