如何在休眠中将表列与另一个表列映射

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 从一个表列中选择一个最小值,并在一个 SQL 语句中将结果插入到另一个表列中

如何导入 xls 并将行分配给表列?

使用 LINQ to SQL 时如何指定/过滤应填充哪些表列?

SQL * Loader映射不同表列中的DataFile字段