Изменение значения столбца, извлеченного из базы данных, перед отображением его в jsp в режиме гибернации

#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:

Вау. Вы ошиблись в двух вещах.

  1. Если предполагается, что поле содержит код, пусть оно содержит код, а не имя. Подобная обработка ваших полей приведет к нечитаемому и не поддерживаемому коду. Если getCode() возвращает имя, getName() возвращает адрес, а getAddress() возвращает номер телефона, вы и ваши коллеги быстро потеряете все свои волосы.

  2. У контакта не должно быть поля 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

Это хорошая статья «шаг за шагом» для начинающих.

Затем вы можете перейти к справочному руководству по гибернации для получения более подробной информации. (Это то, что я сделал !!)