【问题标题】:How to map a table column with another table column in hibernate如何在休眠中将表列与另一个表列映射
【发布时间】:2015-10-01 15:10:56
【问题描述】:

我在休眠状态下创建一个带有弹簧休息的网络应用程序,我被困在两张桌子之间。我想将一个表列与另一个表列映射。我已经在jsp中完成了,但现在我想在hibernate中完成。我正在从警报表中获取 author_id,然后我想从 user_table 中获取该作者 ID 的个人资料图片。

jsp代码:

<%

String sql = "select author_id from alert where id=2";
Statement st = con.createStatement();
ResultSet rs = st.executeQuery(sql);
while(rs.next()){
String aid = rs.getString("author_id");
String sql1 = "select profile_img from user_table where id='"+aid+"'";
Statement st1 = con.createStatement();
ResultSet rs1 = st1.executeQuery(sql1);
while(rs1.next()){
String image_name = rs1.getString("profile_img");
}
}
%>

我想在 hibernate 中进行。这是我的 Alert 类

@Entity
@Table(name="alert")
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public class Alert implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
@Column(name="id")
private long id;

@Column(name="author_id")
private long author_id;

public long getId() {
    return id;
}
public void setId(long id) {
    this.id = id;
}

public long getAuthor_id() {
    return author_id;
}

public void setAuthor_id(long author_id) {
    this.author_id = author_id;
}

这是我的用户类

@Entity
@Table(name="user_table")
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
@Column(name="id")
private long id;

@Column(name="profile_img")
private String img_name;

public long getId() {
    return id;
}

public void setId(long id) {
    this.id = id;
}

public String getImg_name() {
    return img_name;
}

public void setImg_name(String img_name) {
    this.img_name = img_name;
}
}

这是我的 DAO 类:

@Autowired
SessionFactory sessionFactory;

Session session = null;
Transaction tx = null;

public User getUserById(long id) throws Exception {
    session = sessionFactory.openSession();
    User user = (User) session.load(User.class, new Long(id));
    tx = session.getTransaction();
    session.beginTransaction();
    tx.commit();
    return user;
}

@SuppressWarnings({ "unchecked", "rawtypes" })
public List<Alert> getAlertById(long id) throws Exception {
    session = sessionFactory.openSession();
    Criteria cr = session.createCriteria(Alert.class);
    cr.add(Restrictions.eq("alert_viewer_id", id));
    List alert = cr.list();
    tx = session.getTransaction();
    session.beginTransaction();
    tx.commit();
    return alert;
}

请帮助我,我陷入了休眠状态。

【问题讨论】:

    标签: java mysql spring hibernate jsp


    【解决方案1】:

    当您使用 ORM 时,您需要考虑对象及其相互之间的关系,而不是数据库表、列、外键等。虽然您可以将表和列直接映射到类和字段,但您这样做不会获得太多好处,因为将应用程序数据视为对象图并使用 ORM 来管理该图的真正目的将被打破。

    如果你改变:

    @Column(name="author_id")
    private long author_id;
    
    public long getAuthor_id() { return author_id; }
    
    public void setAuthor_id(long author_id) { this.author_id = author_id; }
    

    到:

    @JoinColumn(name = "author_id")
    @ManyToOne(fetch = FetchType.LAZY)
    private User author;
    
    public User getAuthor() { return author; }
    
    public void setAuthor(User author) { this.author = author; }
    

    任何时候你有一个Alert 对象,你可以简单地调用getAuthor 来获取一个User 对象,你可以直接使用它。

    此更改不需要对您的数据库进行任何更改。

    【讨论】:

    • 警报对象将在哪里创建?
    • 在上面的 SQL 代码中,您有一个警报 ID。您触发 SQL 查询以获取具有该 ID 的警报的作者 ID。然后触发第二个 SQL 查询以获取具有先前检索到的 ID 的用户的个人资料图像。使用 Hibernate,如果您执行session.createCriteria(Alert.class).add(Restrictions.eq("id", alertId).uniqueResult(),您将获得一个 ID 等于 alertId 变量值的 Alert 对象。这相当于您上面的第一个查询。然后你只需对alert 对象执行alert.getAuthor().getImg_name()
    • 兄弟,请更改我的代码并发布我无法理解,因为我是休眠新手
    • 在用户类中我不需要添加或更改任何内容?
    • 我将在哪里写 alert.getAuthor().getImg_name()?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-02
    • 2011-10-25
    • 2023-03-14
    • 2012-07-15
    • 1970-01-01
    • 2021-10-16
    相关资源
    最近更新 更多