使用具有Hibernate的外键将对象与来自另一个表的数据进行映射

时间:2011-10-16 02:04:05

标签: java hibernate orm mapping

我正在尝试使用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

我正在尝试使用Responses.ID和Poss_resp.resp_text填充下面显示的Response类。 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 :(得分:0)

ResponsesPoss_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 1}}使用long resp_id,然后通过Response设置器将其设置回setResp_text()。但通过这种方式,你绝对无法享受hibernate IMO提供的好处。