JSF+Hibernate, kilka pytań nowicjusza

1

Witam,

mam problem z dodaniem rekordu do bazy danych za pomocą hibernate i potrzebuję, żeby mi ktoś to wytłumaczył, jak powinno się to robić fachowo. Mam w związku z tym kilka pytań, które są na dole postu. Z góry dziękuję za każdą pomoc.

Na chwilę obecną mam coś takiego:

Plik konfiguracyjny hibernate

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
  <session-factory>
    <property name="hibernate.dialect">org.hibernate.dialect.DerbyDialect</property>
    <property name="hibernate.connection.driver_class">org.apache.derby.jdbc.ClientDriver</property>
    <property name="hibernate.connection.url">jdbc:derby://localhost:1527/Private</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password">tym</property>
    <property name="hibernate.show_sql">true</property>
    <property name="hibernate.current_session_context_class">thread</property>
    <property name="hibernate.query.factory_class">org.hibernate.hql.classic.ClassicQueryTranslatorFactory</property>
    <mapping resource="pl/models/UserTable.hbm.xml"/>
  </session-factory>
</hibernate-configuration>

Wygenerowałem też HibernateUtil i Revenge Engeenering, ale nie były zmieniane, więc ich tu nie wrzucam.

usertable.hbn

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated Jan 2, 2013 9:14:39 PM by Hibernate Tools 3.2.1.GA -->
<hibernate-mapping>
    <class name="pl.models.UserTable" table="USER_TABLE" schema="ROOT">
        <id name="userId" type="long">
            <column name="USER_ID" />
            <generator class="assigned" />
        </id>
        <property name="userLogin" type="string">
            <column name="USER_LOGIN" length="12" />
        </property>
        <property name="userPassword" type="string">
            <column name="USER_PASSWORD" length="12" />
        </property>
        <property name="userName" type="string">
            <column name="USER_NAME" length="12" />
        </property>
        <property name="userMail" type="string">
            <column name="USER_MAIL" length="30" />
        </property>
        <property name="userDate" type="date">
            <column name="USER_DATE" length="10" />
        </property>
    </class>
</hibernate-mapping>

oraz usertable.java. Moje pliki modelowe na podstawie istniejącej tabeli w bazie derby

package pl.models;
// Generated Jan 2, 2013 9:14:38 PM by Hibernate Tools 3.2.1.GA


import java.util.Date;

/**
 * UserTable generated by hbm2java
 */
public class UserTable  implements java.io.Serializable {


     private long userId;
     private String userLogin;
     private String userPassword;
     private String userName;
     private String userMail;
     private Date userDate;

    public UserTable() {
    }

	
    public UserTable(long userId) {
        this.userId = userId;
    }
    public UserTable(long userId, String userLogin, String userPassword, String userName, String userMail, Date userDate) {
       this.userId = userId;
       this.userLogin = userLogin;
       this.userPassword = userPassword;
       this.userName = userName;
       this.userMail = userMail;
       this.userDate = userDate;
    }
   
    public long getUserId() {
        return this.userId;
    }
    
    public void setUserId(long userId) {
        this.userId = userId;
    }
    public String getUserLogin() {
        return this.userLogin;
    }
    
    public void setUserLogin(String userLogin) {
        this.userLogin = userLogin;
    }
    public String getUserPassword() {
        return this.userPassword;
    }
    
    public void setUserPassword(String userPassword) {
        this.userPassword = userPassword;
    }
    public String getUserName() {
        return this.userName;
    }
    
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getUserMail() {
        return this.userMail;
    }
    
    public void setUserMail(String userMail) {
        this.userMail = userMail;
    }
    public Date getUserDate() {
        return this.userDate;
    }
    
    public void setUserDate(Date userDate) {
        this.userDate = userDate;
    }
}

Na koniec plik zawierający kod formularza, z którego dane mają być wrzucone do bazy

                        <h:form>
                            
                            <p><h:inputText label="#{msg.login_form1}" id="login" required="true" styleClass="inputText" value="#{userRegistering.login}">
                                    <f:validateLength minimum="3" maximum="12"/>
                            </h:inputText>&nbsp; 
                            <h:outputText value="#{msg.login_form1}" /></p>
                            
                            <p><h:message for="login" style="color:#800000;font-size:10px;" /></p>
                            
                            
                            
                            <p><h:inputSecret binding="#{passwordComponent}" label="#{msg.login_form2}" id="pass" required="true" styleClass="inputText" value="#{userRegistering.password}">
                                    <f:validateLength minimum="3" maximum="12"/>
                            </h:inputSecret>&nbsp; 
                            <h:outputText value="#{msg.login_form2}" /></p>
                            
                            <p><h:message for="pass" style="color:#800000;font-size:10px;" /></p>
                            
                            
                            
                            <p><h:inputSecret label="#{msg.login_form3}" id="pass2" required="#{not empty passwordComponent.value}" styleClass="inputText" value="#{userRegistering.repassword}">
                                <f:validator validatorId="pl.validatorsPasswordValidator" />
                                <f:attribute name="passwordComponent" value="#{passwordComponent}" />
                            </h:inputSecret>&nbsp; 
                            <h:outputText value="#{msg.login_form3}" /></p>
                            
                            <p><h:message for="pass2" style="color:#800000;font-size:10px;" /></p>
                            
                            
                             
                            <p><h:inputText label="#{msg.login_form4}" id="imie" required="true" styleClass="inputText" value="#{userRegistering.name}">
                                    <f:validateLength minimum="3" maximum="12"/>
                            </h:inputText>&nbsp; 
                            <h:outputText value="#{msg.login_form4}" /></p>
                            
                            <p><h:message for="imie" style="color:#800000;font-size:10px;" /></p>
                            
                             
                            
                            <p><h:inputText label="#{msg.login_form5}" id="mail" required="true" styleClass="inputText" value="#{userRegistering.mail}">
                                    <f:validateLength minimum="4" maximum="30"/>
                                    <f:validator validatorId="pl.validators.MailValidator" />
                            </h:inputText>&nbsp; 
                            <h:outputText value="#{msg.login_form5}" /></p>
                            
                            <p><h:message for="mail" style="color:#800000;font-size:10px;" /></p>
                            
                             
                            <p>&raquo;&nbsp;<h:commandLink value="#{msg.register_button}" action="#{userRegistering.addUserToDB}"/></p>
                            
                        </h:form>

Oraz ziarno do obsługi tego formularza

@ManagedBean
@RequestScoped
public class UserRegistering implements Serializable {

    private String login;
    private String password;
    private String repassword;
    
    UserHelper uh = null;

    public String getRepassword() {
        return repassword;
    }

    public void setRepassword(String repassword) {
        this.repassword = repassword;
    }
    private String name;
    private String mail;

    public UserRegistering() {
        
    }
    
    public UserRegistering(String login, String password, String name, String mail, Date create) {
        this.login = login;
        this.password = password;
        this.name = name;
        this.mail = mail;
    }

    public String getLogin() {
        return login;
    }

    public void setLogin(String login) {
        this.login = login;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getMail() {
        return mail;
    }

    public void setMail(String mail) {
        this.mail = mail;
    }

**Pytania: **

  1. W którym pliku, miejscu, stworzyć metody odpowiedzialne za dodawanie i pobieranie rekordów z tej tabeli?
  2. Jak zrobić, żeby kolumna user_id i user_create (data) uzupełniały się same w odpowiednie wartości, przy dodawaniu rekordów? To znaczy, żeby w pole data wskakiwała aktualna data, a w polę user_id identyfikator o jeden większy, niż w przypadku poprzedniego usera
  3. Jak powinna wyglądać przykładowa metoda do **dodania **rekordu do bazy?
0

dobrze widze, korzystasz z jee a nie wykorzystujesz jpa??

0

Robilem stricte tylko to, co bylo narzucone w tutorialu dla hibernate, natomiast dalej on sie skomplikowal i nie wiem jak to wszystko rozegrac, aby nie pomieszac warstw aplikacji.

1
dreando napisał(a):
  1. W którym pliku, miejscu, stworzyć metody odpowiedzialne za dodawanie i pobieranie rekordów z tej tabeli?

Używałem JdbcTemplate zamiast Hibernate, wtedy tworzyłem po prostu oddzielną paczkę np. u ciebie to by było 'pl.Dao' (data access object), tam tworzysz klasę np. UserDao i w niej umieszczasz metody zajmujące pobieraniem/wstawianiem/modyfikowaniem/usuwaniem danych w tabeli USER_TABLE.

dreando napisał(a):
  1. Jak zrobić, żeby kolumna user_id i user_create (data) uzupełniały się same w odpowiednie wartości, przy dodawaniu rekordów? To znaczy, żeby w pole data wskakiwała aktualna data, a w polę user_id identyfikator o jeden większy, niż w przypadku poprzedniego usera

Dla user_id, podczas tworzenia tabeli, w zależności od typu bazy musisz zrobić auto inkrementację (np. w postgreSQL jest to 'CREATE TABLE USER_TABLE (user_id SERIAL,itd.);').
Aby dodac datę po prostu w metodzie dodawania użytkownika robisz:

Date dataRejestracji = new Date();
setUserDate(dataRejestracji)

Chociaż i tak uważam, że najlepiej trzymać to w bazie jako timestamp.

0

Noi teraz zwraca mi błąd:

/register_page.xhtml @24,162 value="#{userRegistering.ru.userLogin}": Target Unreachable, 'ru' returned null

"ru" jest to obiekt klasy RegisteredUser, wygenerowanej na podstawie istniejącej tabeli przez hibernate.

oto jej kod:

package pl.models;
// Generated Jan 3, 2013 1:38:43 PM by Hibernate Tools 3.2.1.GA


import java.util.Date;

public class RegisteredUser  implements java.io.Serializable {


     private int userId;
     private String userLogin;
     private String userPassword;
     private String userMail;
     private String userName;
     private Date userCdate;

    public RegisteredUser() {
    }

	
    public RegisteredUser(int userId) {
        this.userId = userId;
    }
    public RegisteredUser(int userId, String userLogin, String userPassword, String userMail, String userName, Date userCdate) {
       this.userId = userId;
       this.userLogin = userLogin;
       this.userPassword = userPassword;
       this.userMail = userMail;
       this.userName = userName;
       this.userCdate = userCdate;
    }
   
    public int getUserId() {
        return this.userId;
    }
    
    public void setUserId(int userId) {
        this.userId = userId;
    }
    public String getUserLogin() {
        return this.userLogin;
    }
    
    public void setUserLogin(String userLogin) {
        this.userLogin = userLogin;
    }
    public String getUserPassword() {
        return this.userPassword;
    }
    
    public void setUserPassword(String userPassword) {
        this.userPassword = userPassword;
    }
    public String getUserMail() {
        return this.userMail;
    }
    
    public void setUserMail(String userMail) {
        this.userMail = userMail;
    }
    public String getUserName() {
        return this.userName;
    }
    
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public Date getUserCdate() {
        return this.userCdate;
    }
    
    public void setUserCdate(Date userCdate) {
        this.userCdate = userCdate;
    }
}


Kontroler :

package pl.beans;

import java.util.Date;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import pl.dao.UserDao;
import pl.models.RegisteredUser;


@ManagedBean
@RequestScoped
public class UserRegistering {

    private RegisteredUser ru;
    private String repassword;
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    // DODAWANIE DO BAZY POCZĄTEK
    
    public String addUser(){
        UserDao dao = new UserDao();
        Date cdate = new Date();
        ru.setUserCdate(cdate);
        dao.save(ru);
        return "after_registration";
    }
    
    // DODAWANIE DO BAZY KONIEC
    
    public String getRepassword() {
        return repassword;
    }

    public void setRepassword(String repassword) {
        this.repassword = repassword;
    }

    public RegisteredUser getRu() {
        return this.ru;
    }

    public void setRu(RegisteredUser ru) {
        this.ru = ru;
    }
    
}

Dao

package pl.dao;

import java.util.List;
import org.hibernate.Session;
import org.hibernate.Transaction;
import pl.models.*;

public class UserDao {
    
public void save(RegisteredUser ru) {
    
    Session session = HibernateUtil.getSessionFactory().openSession();
    Transaction t = session.beginTransaction();
    session.save(ru);
    t.commit();
    }

public RegisteredUser getRegisteredUser(int id) {
    
    Session session = HibernateUtil.getSessionFactory().openSession();
    return (RegisteredUser) session.load(RegisteredUser.class, id);
    }

public List<RegisteredUser> list() {
    
    Session session = HibernateUtil.getSessionFactory().openSession();
    Transaction t = session.beginTransaction();
    List lista = session.createQuery("from registered_user").list();
    t.commit();
    return lista;
    }

public void remove(RegisteredUser ru) {
    
    Session session = HibernateUtil.getSessionFactory().openSession();
    Transaction t = session.beginTransaction();
    session.delete(ru);
    t.commit();
    }

public void update(RegisteredUser ru) {
    
    Session session = HibernateUtil.getSessionFactory().openSession();
    Transaction t = session.beginTransaction();
    session.update(ru);
    t.commit();
    }
}

No i xhtml

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core">

    <body>

        <ui:composition template="./WEB-INF/templates/mainTemplate.xhtml">

            <ui:define name="content">
                
                <div class="box">

                    <h2>
                        &raquo; &nbsp;#{msg.register_section}
                    </h2>
                    

                    
                        <h:form>
                            
                            <p><h:inputText label="#{msg.login_form1}" id="login" required="true" styleClass="inputText" value="#{userRegistering.ru.userLogin}">
                                    <f:validateLength minimum="3" maximum="12"/>
                            </h:inputText>&nbsp; 
                            <h:outputText value="#{msg.login_form1}" /></p>
                            
                            <p><h:message for="login" style="color:#800000;font-size:10px;" /></p>
                            
                            
                            
                            <p><h:inputSecret binding="#{passwordComponent}" label="#{msg.login_form2}" id="pass" required="true" styleClass="inputText" value="#{userRegistering.ru.userPassword}">
                                    <f:validateLength minimum="3" maximum="12"/>
                            </h:inputSecret>&nbsp; 
                            <h:outputText value="#{msg.login_form2}" /></p>
                            
                            <p><h:message for="pass" style="color:#800000;font-size:10px;" /></p>
                            
                            
                            
                            <p><h:inputSecret label="#{msg.login_form3}" id="pass2" required="#{not empty passwordComponent.value}" styleClass="inputText" value="#{userRegistering.repassword}">
                                <f:validator validatorId="pl.validatorsPasswordValidator" />
                                <f:attribute name="passwordComponent" value="#{passwordComponent}" />
                            </h:inputSecret>&nbsp; 
                            <h:outputText value="#{msg.login_form3}" /></p>
                            
                            <p><h:message for="pass2" style="color:#800000;font-size:10px;" /></p>
                            
                            
                             
                            <p><h:inputText label="#{msg.login_form4}" id="imie" required="true" styleClass="inputText" value="#{userRegistering.ru.userName}">
                                    <f:validateLength minimum="3" maximum="12"/>
                            </h:inputText>&nbsp; 
                            <h:outputText value="#{msg.login_form4}" /></p>
                            
                            <p><h:message for="imie" style="color:#800000;font-size:10px;" /></p>
                            
                             
                            
                            <p><h:inputText label="#{msg.login_form5}" id="mail" required="true" styleClass="inputText" value="#{userRegistering.ru.userMail}">
                                    <f:validateLength minimum="4" maximum="30"/>
                                    <f:validator validatorId="pl.validators.MailValidator" />
                            </h:inputText>&nbsp; 
                            <h:outputText value="#{msg.login_form5}" /></p>
                            
                            <p><h:message for="mail" style="color:#800000;font-size:10px;" /></p>
                            
                             
                            <p>&raquo;&nbsp;<h:commandLink value="#{msg.register_button}" action="#{userRegistering.addUser}"/></p>
                            
                        </h:form>
                        
                        <p>&raquo; &nbsp;<h:link value="#{msg.clear}" /></p>
                                    
                </div>
                
            </ui:define>

        </ui:composition>

    </body>
</html>

Jakieś pomysły co tu się złego dzieje? :/

0

W klasie UserRegistering, zrób konstruktor i w nim wpisz "ru = new RegisteredUser()" powinno coś pomóc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1