Сопоставление объекта с данными из другой таблицы с использованием внешнего ключа с гибернацией

#java #hibernate #orm #mapping

#java #гибернация #orm #сопоставление

Вопрос:

Я пытаюсь заполнить данные в этом классе из базы данных, используя аннотации сохранения 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, показанный ниже, ответами.ИДЕНТИФИКАТОР и Poss_resp.resp_text. Poss_resp содержит возможные ответы на вопрос. Ответы содержат фактические ответы. resp_id — это внешний ключ для Poss_resp. Однако я просто хочу, чтобы строка resp_text была сохранена, мне не нужен совершенно новый объект. Есть ли какой-то способ добиться этого? Я не могу понять, как сообщить Hibernate, как использовать что-то другое, кроме первичного ключа ответа, и я не определил правильный синтаксис соединения.

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

 @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. Эти комментарии JavaDoc кажутся, как вы говорите, менее полезными.

Ответ №1:

Связь 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 entity , я боюсь, что вам придется вручную написать HQL / SQL /Criteria, чтобы получить с resp_text помощью long resp_id , а затем установить его обратно Response через setResp_text() установщик. Но таким образом вы определенно не сможете воспользоваться преимуществами, предоставляемыми hibernate IMO.

Комментарии:

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