Сопоставление объекта с данными из другой таблицы с использованием внешнего ключа с помощью Hibernate - PullRequest
1 голос
/ 16 октября 2011

Я пытаюсь заполнить данные в этом классе из базы данных, используя аннотации постоянства Hibernate и javax. Вот соответствующие структуры базы данных.

table Poss_resp     
ID  qst_id  resp_text
int int text

table Responses         
ID  qst_id  usr_id  resp_id
int int int int

Я пытаюсь заполнить класс Response, показанный ниже, Responses.ID и Poss_resp.resp_text. Poss_resp содержит возможные ответы на вопрос. Ответы содержит фактические ответы. resp_id - это внешний ключ для Poss_resp. Тем не менее, я просто хочу сохранить строку resp_text, я не хочу совершенно новый объект. Есть ли способ добиться этого? Я не могу понять, как сообщить Hibernate, как использовать что-то кроме первичного ключа Response, и не определил правильный синтаксис JOIN.

Мой класс ответа:

@Entity
@Table(name="responses")
public class Response {

    private long id;
    private long qst_id;
    private long resp_id;
    private String resp_text;


    /**
     * 
     */
    public Response() {
        // TODO Auto-generated constructor stub
    }


    /**
     * @return the id
     */
    @Id
    @Generated(value="assigned")
    @Column(name="ID")
    public long getId() {
        return id;
    }


    /**
     * @param id the id to set
     */
    public void setId(long id) {
        this.id = id;
    }


    /**
     * @return the qst_id
     */
    @Column(name="qst_id")
    public long getQst_id() {
        return qst_id;
    }


    /**
     * @param qst_id the qst_id to set
     */
    public void setQst_id(long qst_id) {
        this.qst_id = qst_id;
    }


    /**
     * @return the resp_id
     */
    @Column(name="resp_id")
    public long getResp_id() {
        return resp_id;
    }


    /**
     * @param resp_id the resp_id to set
     */
    public void setResp_id(long resp_id) {
        this.resp_id = resp_id;
    }


    /**
     * @return the resp_text
     */
    public String getResp_text() {
        return resp_text;
    }


    /**
     * @param resp_text the resp_text to set
     */
    public void setResp_text(String resp_text) {
        this.resp_text = resp_text;
    }

Если это вообще возможно, я бы предпочел аннотации.

1 Ответ

0 голосов
/ 16 октября 2011

Соотношение Responses и Poss_resp таблицы много-к-одному, вы должны отобразить это соотношение в классе Response. В противном случае, в hibernate недостаточно знаний, чтобы получить Poss_resp.resp_text с учетом Responses.resp_id

Ваша таблица Poss_resp должна быть сопоставлена ​​с классом сущности (скажем, Class PossResp)

Затем вы можете объявить отношения многие-к-одному, используя @ManyToOne и @JoinColumn, например:

@Entity
@Table(name="responses")
public class Response {
   ..................
   private PossResp possResp;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "resp_id") 
    public PossResp getPossResp() {
        return possResp;
    }
    ................

}

Чтобы получить resp_text для данного Response объекта, вызовите

 response.getPossResp().getRespText();

Я не хочу совершенно новый объект. Есть ли способ достичь этого?

Если вы отображаете только long resp_id вместо объекта PossResp в сущности PossResp, я боюсь, что вам придется вручную писать HQL / SQL / Criteria, чтобы получить resp_text с использованием long resp_id и затем установите его обратно на Response с помощью установщика setResp_text(). Но при этом вы точно не сможете пользоваться преимуществами гибернации IMO.

...