Hibernate MS SQL Присоединение проблема - PullRequest
0 голосов
/ 20 февраля 2010

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

Моя проблема сейчас в том, что есть вторая таблица, которая содержит информацию о точках загрузки и выгрузки. Вторая таблица, я называю это JEP, имеет первичный ключ, состоящий из нескольких элементов: тип (загрузка или выгрузка), почтовый индекс и номер клиента.

Я создал сущность JobEndPoint, а NetBeans также создал объект, представляющий первичный ключ JobEndPointPK, содержащий все эти поля.

Я хочу добавить два JobEndPoint (loadPoint и unloadPoint) к моей сущности Job. Моя проблема сейчас: как мне аннотировать это в Hibernate? На мой взгляд, это корабль отношений @OneToOne. Было бы идеально, если бы я мог указать инструкцию SELECT, например SELECT * FROM JEP WHERE type="load" AND customer_nr="123" AND zip_code="123 ... ". Это возможно с Hibernate?

Спасибо за вашу помощь!

Regeards,

Marco


Вот сущности:

@Entity
@Table(name = "Auftragsdaten", catalog = "...", schema = "dbo")
public class Job implements Comparable<Object>, Serializable {

    private static final long serialVersionUID = 4285871251915951149L;

    @Id
    @Basic(optional = false)
    @Column(name = "`id`", nullable = false)
    int id;

    @Column(name = "`AufNr`", nullable=false)
    int jobId;

    @Transient
    List<Integer> jobsAdded;

    @Column(name = "`Beladedatum`", nullable=false)
    @Temporal(TemporalType.DATE)
    Date loadDate;

    @Column(name = "`Beladezeit`")
    @Temporal(TemporalType.TIME)
    Date loadTimeFrom;

    @Transient
    Date loadTimeTo;

    @Column(name = "`Entladedatum`", nullable=false)
    @Temporal(TemporalType.DATE)
    Date unloadDate;

    @Column(name = "`Entladezeit Beginn`")
    @Temporal(TemporalType.TIME)
    Date unloadTimeFrom;

    @Column(name = "`Entladezeit Ende`")
    @Temporal(TemporalType.TIME)
    Date unloadTimeTo;

    @Transient
    List<JobEndPoint> froms;

    @OneToOne
    @JoinColumns ({
        @JoinColumn(name="`Beladetyp`", referencedColumnName = "`Ladetyp`", insertable = false, updatable = false),
        @JoinColumn(name="`AbsNr`", referencedColumnName = "`KundenNr`", insertable = false, updatable = false),
        @JoinColumn(name="`Verkehrsart`", referencedColumnName = "`VerkArt`", insertable = false, updatable = false),
        @JoinColumn(name="`von LKZ`", referencedColumnName = "`LKZ`", insertable = false, updatable = false),
        @JoinColumn(name="`von PLZ`", referencedColumnName = "`PLZ`", insertable = false, updatable = false)
    })
    JobEndPoint fromPoint;

    @Transient
    JobEndPoint toPoint;

    @Column(name = "`Verkehrsart`", length = 10, nullable=false)
    @Enumerated
    JobType type;

    @Column(name = "`Anzahl Paletten CCG1`")
    int numberCCG1;

    @Column(name = "`Anzahl Paletten CCG2`")
    int numberCCG2;

    @Transient
    int numberFullContainer;

    @Transient
    int numberEmptyContainer;

    @Column(name = "`Anzahl Container`")
    int numberContainer;

    @Column(name = "`Anz Stellplätze`")
    int numberUnits;

    @Column(name = "`Bruttogewicht`", nullable=false)
    int loadWeight;

    @ManyToOne
    @JoinColumn(name="`Kühlkennzeichen`")
    CoolingCode coolingCode;
}

@Entity
@Table(name = "BES", catalog = "...", schema = "dbo")
public class JobEndPoint implements Serializable {

    private static final long serialVersionUID = 1017986852824783744L;

    @Id
    protected JobEndPointPK jobEndPointPK;

    (...)
}

@Embeddable
public class JobEndPointPK implements Serializable {

    @Basic(optional = false)
    @Column(name = "`Ladetyp`", nullable = false, length = 50)
    @Enumerated
    EndPointType type;

    @Basic(optional = false)
    @Column(name = "`KundenNr`", nullable = false)
    int customerId;

    @Basic(optional = false)
    @Column(name = "`VerkArt`", nullable = false, length = 10)
    @Enumerated
    JobType jobType;

    @Basic(optional = false)
    @Column(name = "`LKZ`", nullable = false, length = 3)
    String countryCode;

    @Basic(optional = false)
    @Column(name = "`PLZ`", nullable = false, length = 7)
    String zipCode;
}

1 Ответ

0 голосов
/ 20 февраля 2010

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

Я понимаю, что JobEndPointPK реализован как компонент идентификатора (см. Справочник Hibernate, глава 8.4 ). Примечание: очень важно, чтобы он правильно реализовывал методы equals и hashCode`, так как Hibernate полагается на них.

Обновлено: При условии, что ваши JobEndPoint и JobEndPointPK выглядят примерно так:

@Embeddable
class JobEndPointPK {
    @Column(name = "type", nullable = false)
    @Enumerated
    EndPointType type;

    @Column(name = "zipCode", nullable = false)
    String zipCode;

    @Column(name = "customerNumber", nullable = false)
    int customerId;

    // equals, hasCode, getters, setters etc.
}

@Entity
class JobEndPoint {
    @Id
    private JobEndPointPK key;

    // getters, setters etc.
}

Аннотация к отображению будет выглядеть примерно так:

@Entity
class Job {
    @OneToOne
    @JoinColumns ({
        @JoinColumn(name="loadPointType", referencedColumnName = "type"),
        @JoinColumn(name="loadPointZip", referencedColumnName = "zipCode"),
        @JoinColumn(name="loadPointCust", referencedColumnName = "customerNumber")
    })
    private JobEndPoint loadPoint;
    // similarly for unloadPoint
    // other properties
}

Пример адаптирован из здесь .

Я не уверен, что делать с JobEndPointPK.type, хотя для loadPoint это, очевидно, Load и для unloadPoint, Unload, так что вы, скорее всего, не хотите хранить его отдельно в БД. Я предполагаю, что вы можете указать значение с помощью аннотации @Formula, но я не видел конкретного примера для этого.

Обратите внимание, что весь этот код чисто экспериментальный, я его не проверял.

Существуют и другие варианты темы. Для получения дополнительной информации см. Раздел «Составные ключи с аннотациями» в Глава 8 Java Persistence с Hibernate .

...