Hibernate - сохранить встраиваемый ресурс - PullRequest
1 голос
/ 06 марта 2012

Я только начинаю изучать постоянство базы данных Java с помощью Hibernate ORM и столкнулся с проблемой, которую мне не удалось решить.

У меня есть два класса:

@Embeddable
public class Resource {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Resource() {
    }
}

@Entity
public class Group {

    @Embedded
    private Map<String, Resource> resources;

    @Id
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Map<String, Resource> getResources() {
        return resources;
    }

    public void setResources(Map<String, Resource> resources) {
        this.resources = resources;
    }

    public Group() {
        resources = new HashMap<String, Resource>();
    }
}

Ресурс не должен иметь свою собственную таблицу, поскольку он не должен существовать вне области действия группы.Вот почему я использовал Embeddable, чтобы рассматривать его как компонент.

Подводя итог, я хотел бы знать, как я могу хранить эти классы в базе данных, используя Hibernate ORM.Класс Resource не должен быть сущностью, поскольку ему не нужен собственный класс.

И я бы предпочел использовать нотации сопоставления, а не файлы XML.

Как я понялэта ошибка:

Syntax error in SQL statement "INSERT INTO GROUP[*] (NAME) VALUES (?) "; expected "identifier"; SQL statement:

1 Ответ

0 голосов
/ 06 марта 2012

Можно сохранить все экземпляры Ресурса, принадлежащие определенной группе, в одну строку базы данных с самой Группой, создав класс, заключающий в группы, и сохранив его как поле Сериализуемый в BLOB в базе данных.

Поскольку такое решение запрашивает больше кода и приводит к сбивающей с толку модели данных, маловероятно, что вы действительно хотите ограничить себя только одной таблицей.

Если, как вы сказали, Ресурс полностью принадлежит Группе, и вы хотите получить к ним доступ по какому-либо строковому ключу, тогда @ElementCollection, содержащий экземпляры встраиваемого Ресурса, является решением (при условии, что ваша версия Hibernate уже имеет его):

@ElementCollection
private Map<String, Resource> resources;

Если у вас нет доступа к коллекции ресурсов по имени, тогда достаточно выполнить следующее:

@ElementColection
private Set<Resource> resources;

Дополнительные примеры тонкой настройки вашей коллекции элементов можно найти по адресу: Java Persistence / ElementCollection

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