如何在休眠中将表列与另一个表列映射
Posted
技术标签:
【中文标题】如何在休眠中将表列与另一个表列映射【英文标题】: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;
请帮助我,我陷入了休眠状态。
【问题讨论】:
【参考方案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()?以上是关于如何在休眠中将表列与另一个表列映射的主要内容,如果未能解决你的问题,请参考以下文章
如何在scala spark中将数据框的特定列与另一个列连接[重复]
Sql 从一个表列中选择一个最小值,并在一个 SQL 语句中将结果插入到另一个表列中