Как добавить отношение JPA к устаревшей базе данных - PullRequest
0 голосов
/ 31 июля 2011

Я прихожу из среды C # и смотрю на JPA в Java-проекте, так что я надеюсь, что то, с чем я столкнулся, является просто концептуальной проблемой.

У меня есть устаревшая база данных, схему которой я не могу изменить, и мне нужно написать DAL.

Я сгенерировал (упрощенно для примера) следующие объекты ...

@Entity
@Table(name = "crag", catalog = "rad_dbo")
public class CragEntity {
    private int id;

    @Column(name = "id")
    @Id
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    private int fkSubRegionId;

    @Column(name = "fk_subRegionId")
    @Basic
    public int getFkSubRegionId() {
        return fkSubRegionId;
    }

    public void setFkSubRegionId(int fkSubRegionId) {
        this.fkSubRegionId = fkSubRegionId;
    }
}

и

@Table(name = "subRegion", catalog = "rad_dbo")
@Entity
public class SubRegionEntity {
    private int id;

    @Column(name = "id")
    @Id
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}

Я пытался добавить отношение к CragEntity, чтобы получить доступ к его подрегиону

@ManyToOne
@JoinColumn(name="fk_SubRegionId",nullable=false)
private SubRegionEntity subRegion;

но когда я пытаюсь запустить

select c from CragEntity c where c.subRegion.region = :area

Я получаю исключение

java.lang.RuntimeException: org.hibernate.QueryException: could

не разрешать свойство: subRegion of: uk.co.bmc.rad.dal.CragEntity

Надеюсь, это возможно, и я медленно ...

Большое спасибо заранее за любую помощь!

Ответы [ 2 ]

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

Оказалось, что было несколько проблем - одна концептуальная, одна с тем, как IntelliJ создал отношения, которые я копировал, и одна между стулом и клавиатурой ...

IntelliJ выбрал отношения между регионом и субрегионом с владельцем на «неправильном» конце - возможно, проблема схемы, а не ошибка IntelliJ. Как только я понял это и выяснил, как исправить, я мог бы скопировать это в CragEntity и SubRegionEntity

В CragEntity я добавил:

private SubRegionEntity subRegion;

        @ManyToOne
        @JoinColumn(name="fk_SubRegionId",nullable=false)
        public SubRegionEntity getSubRegion() {
            return subRegion;
        }

        public void setSubRegion(SubRegionEntity subRegion) {
            this.subRegion = subRegion;
        }

и затем в SubRegionEntity я добавил:

private List<CragEntity> crags;

    @OneToMany(mappedBy = "subRegion")
    List<CragEntity> getCrags() {
        return crags;
    }

    public void setCrags(List<CragEntity> crags) {
        this.crags = crags;
    }

Кроме того, кажется, что любой класс сущностей, который будет одним концом отношения, должен реализовывать сериализуемый (я думаю, сущности сериализуются в владельца. Так что нужно было добавить в SubRegionEntity и RegionEntity

Глупость с моей стороны, конечно, заключалась в том, что запрос должен был быть c.subRegion.region.name В противном случае я сравнивал объект типа RegionEntity со строкой ... doh - очень глупая ошибка с моей стороны.

Я новичок в TDD, но как всегда, как только я написал тесты для того, что, по моему мнению, должно происходить с существующим кодом, я прошел через мои ошибки (и получил ключевые слова google по исключениям и ошибкам: -))

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

В вашем запросе вы ищете свойство "subRegion", хотя в определении вашей сущности у вас есть имя "fkSubRegionId", поэтому вы должны изменить имя переменной или запрос. ;)

РЕДАКТИРОВАТЬ: Извините, я неправильно понял отношения.

Можете ли вы получить доступ к свойству (без выполнения запроса HQL) с помощью отношений внутри кода?

Если вы не хотите выбирать только определенные поля в своем запросе, я бы порекомендовал запрос типа:

from CragEntity c where c.subRegion.region='theRegion'
...