2015-07-13 32 views
1

我正在使用spring rest在hibernate中创建一个Web应用程序,并且我卡在两个表格之间。我想要映射一个表列与另一个表列。我已经在jsp中完成了,但现在我想在hibernate中完成。我从alert表中获取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.Here是我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; 
} 

这里是我的User类

@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对象回来,你可以直接合作。

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

+0

哪里会创建警报对象? –

+0

在上面的SQL代码中,您有一个警报ID。您启动一个SQL查询以获取具有该ID的警报的作者ID。然后,您再次启动第二个SQL查询,以便使用先前检索的ID获取用户的配置文件映像。使用Hibernate,如果你使用'session.createCriteria(Alert.class).add(Restrictions.eq(“id”,alertId).uniqueResult()',你将得到一个Alert对象,其id等于'alertId'变量,这相当于上面的第一个查询,然后你只需在'alert'对象上''alert.getAuthor()。getImg_name()'' – manish

+0

兄弟请更改我的代码并发布我无法理解,因为我在休眠 –