2015-07-13 2 views
1

Я создаю веб-приложение в спящем режиме с весенним отдыхом, и я застрял между двумя таблицами. Я хочу сопоставить столбец таблицы с другим столбцом таблицы. Я сделал это в jsp, но теперь я хочу сделать это в спящем режиме. Я извлекаю author_id из таблицы предупреждений, а затем хочу получить профиль профиля этого идентификатора автора из user_table.Как сопоставить столбец таблицы с другим столбцом таблицы в hibernate

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 мой класс оповещения

@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 вы имеете идентификатор оповещения. Вы запускаете SQL-запрос, чтобы получить идентификатор автора для предупреждения с этим идентификатором. Затем вы запускаете второй запрос SQL, чтобы получить изображение профиля пользователя с идентификатором, полученным ранее. С Hibernate, если вы выполняете 'session.createCriteria (Alert.class) .add (Restrictions.eq (« id », alertId) .uniqueResult()', вы получите объект «Alert» с идентификатором, равным значению 'alertId'.Это эквивалентно первому запросу выше.Также вы просто делаете' alert.getAuthor(). getImg_name() 'на объекте' alert'. – manish

+0

bro, пожалуйста, измените мой код и опубликуйте, я не могу понять, потому что Я новичок в hibernate –

Смежные вопросы