#sql #hibernate #hibernate-mapping
#sql #переход в режим гибернации #режим гибернации-сопоставление
Вопрос:
Я новичок в hibernate Framework и работаю над очень простой структурой.
Сценарий:
У меня есть 2 таблицы, скажем, A и B. Столбец в A является внешним ключом в A и первичным ключом в B. Теперь я хочу изменить значение этого конкретного столбца в таблице A на соответствующее значение другого столбца в таблице B …. просто для отображения в JSP, а не в самой базе данных.
Я хочу сделать это, потому что в таблице A у меня есть код, а в таблице B у меня есть соответствующее значение, и я хочу отобразить значение, а не код.
Как я могу этого добиться? (возможно, объединения?)
Вот мой текущий код:
Соединение в режиме гибернации:
public class HibernateConnection {
private static final SessionFactory sessionFactory = buildSessionFactory();
private static SessionFactory buildSessionFactory() {
try {
// Create the SessionFactory from hibernate.cfg.xml
return new AnnotationConfiguration().configure().buildSessionFactory();
} catch (Throwable ex) {
System.err.println("Initial SessionFactory creation failed." ex);
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
Класс, в котором выполняется запрос:
public class contactQuery {
public List<contactPersistence> list(String whereClause){
Session session = HibernateConnection.getSessionFactory().getCurrentSession();
session.beginTransaction();
List<contactPersistence> contactList = null;
try {
contactList = (List<contactPersistence>) session.createQuery(" from contactPersistence " whereClause).list();
session.getTransaction().commit();
} catch (HibernateException e) {
System.out.println(e.getMessage());
session.getTransaction().rollback();
}
return contactList;
}
}
Класс сохраняемости:
@Entity
@Table(name="Contacts")
public class contactPersistence implements Serializable{
private static final long serialVersionUID = -8767337896773261247L;
private String Contact_Code;
private String Name;
private String Customer_Code;
//other columns//
@Id
@GeneratedValue
@Column (name="Job_Title")
public String getJob_Title() {
return Job_Title;
}
public void setJob_Title(String Job_Title) {
this.Job_Title = Job_Title;
}
....
....
//other columns defined similarly
....
....
}
Здесь я хочу заменить customer_code именем клиента из другой таблицы.
Я попытался изменить значение в классе persistence (в методе setter столбца), но это изменяет значение в самой базе данных с помощью команды update. Это не то, чего я хочу.
Любое предложение приветствуется.
И я предоставил информацию, которой, по моему мнению, было бы достаточно, если это не так, пожалуйста, прокомментируйте.
Редактировать:
Это jsp, в котором я отображаю данные:
<s:iterator value="contactDetail" var="contactTable">
<tr>
<td><s:property value="Name"/></td>
<td><s:property value="Job_Title"/></td>
<td><s:property value="Email"/></td>
<td><s:property value="Phone"/></td>
<td><s:property value="Mobile"/></td>
<td><s:property value="Fax"/></td>
<td><s:property value="Address"/></td>
<td><s:property value="Notes"/></td>
</tr>
</s:iterator>
ContactDetail и contactTable происходят из класса action:
private List<contactPersistence> contactDetail;
public List<contactPersistence> getContactDetail() {
return contactDetail;
}
public void setContactDetail(List<contactPersistence> contactDetail) {
this.contactDetail = contactDetail;
}
private String contactTable;
public String getContactTable() {
return contactTable;
}
public void setContactTable(String contactTable) {
this.contactTable = contactTable;
}
private contactQuery contactQuery;
///////////////////contact detail is populated here//////////
this.contactDetail=contactQuery.list(deWhereClause);
Ответ №1:
Вау. Вы ошиблись в двух вещах.
-
Если предполагается, что поле содержит код, пусть оно содержит код, а не имя. Подобная обработка ваших полей приведет к нечитаемому и не поддерживаемому коду. Если getCode() возвращает имя, getName() возвращает адрес, а getAddress() возвращает номер телефона, вы и ваши коллеги быстро потеряете все свои волосы.
-
У контакта не должно быть поля
customerCode
типаString
. В нем должно быть полеcustomer
типаCustomer
, гдеCustomer
— объект Hibernate, представляющий клиента. Это называется ассоциацией. Если у клиента несколько контактов, это ассоциация ManyToOne. Если у него есть только один, это ассоциация OneToOne. Таким образом, чтобы получить имя клиента, вы просто использовалиcontact.getCustomer().getName()
.
Вам следует прочитать справочное руководство по гибернации.
Примечание: несоблюдение соглашений об именовании Java затрудняет чтение вашего кода. Имена классов должны начинаться с заглавной буквы, а переменной и метода — со строчной. Ни один из них не должен содержать подчеркивания (пример: ContactPersistence, JobTitle)
Комментарии:
1. Спасибо за ответ JB!! 1.) Я думаю, вы что-то не так поняли, если говорите о первом пункте, потому что именно так я это и сделал, getCode возвращает код, а getName возвращает имя и т.д. Я просто хотел отобразить имя вместо кода. 2.) Я считаю, что это должно сработать, большое спасибо. Я прочитаю об ассоциации и попробую ее. Спасибо за справочную ссылку на руководство.
2. Что касается соглашения об именовании, я знаю, что здесь это неправильно, но я думал, что переменные, представляющие столбцы, должны точно совпадать с именами столбцов в базе данных, вот почему я написал их таким образом. Разве это не обязательно?
3. Привет, JB, я читал об ассоциациях, но не могу понять, как я могу изменить свой список ContactDetails (который я использую в jsp для отображения сведений в таблице), чтобы включить столбец с именем клиента вместо кода клиента. Я включил аннотацию «многие к одному» в класс contactPersistence, а также создал объект класса customerPersistence с помощью getter и setter. Но все же, как мне получить доступ к имени клиента в jsp …. пожалуйста, посоветуйте.. Я действительно застрял.
4. Наконец-то достучался… Спасибо, ребята.
Ответ №2:
Для тех, кто все еще сталкивается с подобной проблемой, вот ссылка, которая помогла от начала до конца разобраться с ассоциациями.
http://levelup.lishman.com/hibernate/getting-started/index.php
Это хорошая статья «шаг за шагом» для начинающих.
Затем вы можете перейти к справочному руководству по гибернации для получения более подробной информации. (Это то, что я сделал !!)