【问题标题】:Mapping object with data from another table using foreign key with Hibernate使用 Hibernate 的外键将对象与另一个表中的数据映射
【发布时间】:2011-10-16 02:04:04
【问题描述】:

我正在尝试使用 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 保存问题的可能答案。 Responses 包含给出的实际答案。 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;
    }

如果可能的话,我更喜欢注释。

【问题讨论】:

  • 那些JavaDoc cmets,怎么说呢,用处不大。

标签: java hibernate orm mapping


【解决方案1】:

Responses 和Poss_resp 表的关系是多对一的,你应该在Response 类中映射这种关系。否则,鉴于Responses.resp_id,hibernate 没有足够的知识来获取Poss_resp.resp_text

您的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;
    }
    ................

}

要在给定Response 对象的情况下获取resp_text,请调用

 response.getPossResp().getRespText();

我不想要一个全新的对象。有什么方法可以实现吗?

如果你只映射long resp_id而不是PossResp实体中的PossResp对象,恐怕你必须手动编写HQL/SQL/Criteria来获取resp_text使用long resp_id然后通过setResp_text() setter 将其设置回Response。但是这样一来,你肯定无法享受到hibernate IMO提供的好处。

【讨论】:

  • 已经知道这是真的。确实需要中间对象。就个人而言,我觉得这很浪费表格设计,但我总是可以将其隐藏在另一层之后。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-20
  • 1970-01-01
  • 1970-01-01
  • 2011-08-10
  • 2012-03-22
  • 2013-12-09
  • 2016-07-02
相关资源
最近更新 更多