Spring с Hibernate, объединение данных из другой таблицы и сопоставление с новым вспомогательным объектом - PullRequest
1 голос
/ 22 июля 2011

Сначала я должен сказать, что я совсем новичок в Spring и Hibernate.

Теперь моя ситуация: у меня есть одна таблица с именем Places, которая имеет: Id PK, имя и описание.у меня есть вторая таблица с именем Edges, которая имеет: ID PK, fromPlaces (fk для pk id из мест) и toPlaces (также ссылается на id из мест).

теперь я хочу сделать запрос, которыйв конечном итоге будет отображаться на объект, который будет иметь мой объект Edge плюс оба имени ссылки fromPlace и ссылки toPlaces.

в настоящее время у меня есть это в моем DAO, который функционирует нормально:

public List<Edge> listEdges() {
    return sessionFactory.getCurrentSession().createQuery("from Edge")
            .list();
}

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

ВТОРОЕ РЕДАКТИРОВАНИЕ: Добавление решения для моих классов как для ссылок, так и впоследствии, если место удаляется для автоматического удаления объекта.ссылки на Edge-объекты.

   @Entity
@Table(name="PLACES")
public class Place {

        @Id
        @Column(name="ID")
        @GeneratedValue
        private Integer id;

        @Column(name="NAME")
        private String name;

        @Column(name="DESCRIPTION")
        private String description;

        @Column(name="IMAGEURL")
        private String imageUrl;

        @Column(name="ISVALIDDESTINATION")
        @Type(type = "org.hibernate.type.NumericBooleanType")
        private boolean validDestination;

        @OneToMany(cascade = CascadeType.ALL)
        @JoinColumn(name = "FROMPLACE_ID")
        private Set<Edge> fromPlace = new HashSet<Edge>(0);

        @OneToMany(cascade = CascadeType.ALL)
        @JoinColumn(name = "TOPLACE_ID")
        private Set<Edge> toPlace = new HashSet<Edge>(0);

И это моя краевая модель: обратите внимание, я здесь опускаю методы получения и установки, потому что у них нет аннотаций, они просто стандартные.

   @Entity
    @Table(name = "EDGES")
    public class Edge {

        @Id
        @Column(name = "ID")
        @GeneratedValue
        private Integer id;

        @ManyToOne(fetch=FetchType.EAGER)
        @JoinColumn(name="FROMPLACE_ID")
    private Place fromPlace;

    @ManyToOne(fetch=FetchType.EAGER)
        @JoinColumn(name="TOPLACE_ID")
    private Place toPlace;

        @Column(name="COST")
        private Integer cost;

Ответы [ 2 ]

2 голосов
/ 22 июля 2011

Прежде всего, вам нужно отобразить ваши сущности. Документы "Hibernate Annotations" - хорошее начало* duffymo предлагаемые коллекции) должны отображаться как @ManyToOne

. После этого ваш метод listEdges, приведенный выше, вернет список Edge объектов, каждый из которых будет иметь (возможно, лениво).getFromPlaces() и getToPlaces() методы, возвращающие соответствующие Places экземпляры.

Теперь, если вы хотите вернуть отдельный вспомогательный объект, содержащий Edge и только Имена соответствующих Places сущностей, вам нужно будет создать этот объект вместе с соответствующим конструктором и написать запрос , ссылающийся на этот конструктор .

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

Редактировать (на основепри обновлении вопроса):

Вместо этого ваше сопоставление Edge должно выглядеть примерно так:

@Entity
@Table(name = "EDGES")
public class Edge {

    @Id
    @GeneratedValue
    private Integer id;

    @ManyToOne
    @JoinColumn(name="FROMPLACE")
    private Place fromPlace;

    @ManyToOne
    @JoinColumn(name="TOPLACE")
    private Place toPlace;
}

Обратите внимание, что необязательно указывать @Column в полях, имя которых соответствует столбцуназвание.Также обратите внимание, что для обозначения внешних ключей обычно используется суффикс "_ID" (например, "FROMPLACE_ID") - если вы это сделаете, вы также можете опустить объявления @JoinColumn.

0 голосов
/ 22 июля 2011

Перестаньте думать меньше с точки зрения таблиц и больше с точки зрения объектов.

Вам необходим объект Edge с отношениями 1: m для размещения ссылок, в и из.

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