[ fedzy @ 07.09.2011. 21:03 ] @
Pozdrav,
Pocetnik sam u radu sa JSP, Hibernetom i slicnim tehnologijama.

Pravim vise korisnicki sistem za filateliste. Model se sastoji iz samo 3 tabele: User, Stamp i Series. Stamp i User bi trebali da budu vezani vise prema vise, a Series je vezano za Stamp. Na projektu koristim JSP, Hibernet, My SQL.
Projekat je vec prilicno odmakao ali nekoliko opcija nikako ne mogu da namestim:

1. Ne mogu namestim da se, npr. kod apdejta marke, u kombo boksu pojavi vrednost koja je snimljena u bazu. Mogu da izvucem sve vrednosti, ali na prvom mestu nije vrednost koja je snimljena.

2. Tabela Stamp ima kao polje slika tipa BLOB. Unos marke radi bez problema, bar se nadam, ali kada treba da prikaze na JSP stranici, ne moze da se ucita. Za ucitavanje slike koristim ImageServlet.. Koristio sam System.out.print da vidim sta se dogadja u ImageServlet I izgleda da aplikacija uopste ne ulazi u servlet, ali ne javlja nikakvu gresku.

3. Spomenuo sam vec da su Stamp I User povezani vezom vise prema vise, ali kada snimim marku u bazu u relacionoj tabeli izmedju Stamp i User se ne snimaju strain kljucevi. Zapravo sve funcionise kao jedan prema vise veza. Petpostavljam da treba nesto da podesim u hbm fajlovima ali ne znam sta.

Ovo su za sada jedini problemi. Svaka pomoc ili savet je dobrodosla. Hvala unapred.

[ nemnesic @ 07.09.2011. 21:11 ] @
jel mozes da uploadujes code koji ti javlja problem?
[ fedzy @ 07.09.2011. 21:17 ] @
Naravno. Da uploadujem klase koje mi prave problem ili da samo iskopiram delove koda koji prave problem?
[ nemnesic @ 07.09.2011. 21:24 ] @
hmmm...ajs samo delove prvo.
[ fedzy @ 07.09.2011. 21:39 ] @
Ovo je deo koda sa combo boxom iz JSP stranice:
Code:

<td>Serija</td>
        <td><select name="cboxserije">
      <%List <Series> ls=Controler.getSeries();
      for (int i=0;i<ls.size();i++){ 
       String  seriesId=ls.get(i).getSeriesId() ;    
       %>  <option value="<%=seriesId %>"selected="selected"> <%=ls.get(i).getSeriesDescription()%></option>
        <%}%>
      </select></td>




Deo sa slikom:
Code:

<td>Slika</td>
        <td style="border-style: solid; border-width: 5px; border-color: #93b6cc">
         <% if (marka.getPhoto().length>0){ %>
         <img width="150" src=<%=request.getContextPath()+"/ImageServlet?catalogId="+marka.getCatalogId()%>></img>
         <% }else{%>
         <img width="150" src="../images/no_image.gif"></img>
         <%} %>
        </td>




ImageServlet.java
Code:

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.ServletException;
import model.Controler;
import model.Stamp;
import java.io.*;

public class ImageServlet  extends HttpServlet
{
    public void doGet(HttpServletRequest  request, HttpServletResponse response)
                 throws ServletException, IOException
    {
        String catalogId=request.getParameter("catalogId");
        System.out.println("cat ID: "+ catalogId );
        int broj= Integer.valueOf(catalogId);
        System.out.println("cat ID posle konverzije: "+ broj );
        Stamp marka = Controler.getStamp(broj);
        byte[] slika =marka.getPhoto();
        try{
            response.setContentType("image/gif");
            ServletOutputStream out = response.getOutputStream();
            out.write(slika);
            out.flush();
        }
        catch(Exception e){
           e.printStackTrace();
           return;
        }

    }        
}


[ fedzy @ 07.09.2011. 21:43 ] @
HBM fajlovi za koje sumnjam da nisu dobro podeseni:

Stamp.hbm
Code:

<?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 30.01.2011. 12.37.58 by Hibernate Tools 3.2.2.GA -->
<hibernate-mapping>
    <class name="model.Stamp" table="stamp" catalog="philately">
        <id name="catalogId" type="int">
            <column name="CatalogID" />
            <generator class="assigned" />
        </id>
        <many-to-one name="series" class="model.Series" fetch="select">
            <column name="SeriesID" not-null="true" />
        </many-to-one>
        <property name="nominalValue" type="java.lang.Integer">
            <column name="NominalValue" />
        </property>
        <property name="value" type="java.lang.Integer">
            <column name="Value" />
        </property>
        <property name="color" type="string">
            <column name="Color" />
        </property>
        <property name="country" type="string">
            <column name="Country" />
        </property>
        <property name="circulation" type="java.lang.Integer">
            <column name="Circulation" />
        </property>
        <property name="tag" type="string">
            <column name="Tag" />
        </property>
        <property name="photo" type="binary">
            <column name="Photo" />
        </property>
        <property name="year" type="string">
            <column name="Year" />
        </property>
        <set name="users" inverse="true" table="relationship_1">
            <key>
                <column name="CatalogID" not-null="true" />
            </key>
            <many-to-many entity-name="model.User">
                <column name="IDUser" not-null="true" />
            </many-to-many>
        </set>
    </class>
</hibernate-mapping>



User.hbm
Code:

<?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 30.01.2011. 12.37.58 by Hibernate Tools 3.2.2.GA -->
<hibernate-mapping>
    <class name="model.User" table="user" catalog="philately">
        <id name="iduser" type="int">
            <column name="IDUser" />
            <generator class="assigned" />
        </id>
        <property name="userName" type="string">
            <column name="UserName" />
        </property>
        <property name="userPassword" type="string">
            <column name="UserPassword" />
        </property>
        <property name="name" type="string">
            <column name="Name" />
        </property>
        <property name="surname" type="string">
            <column name="Surname" />
        </property>
        <property name="email" type="string">
            <column name="Email" />
        </property>
        <property name="role" type="string">
            <column name="Role" />
        </property>
        <set name="stamps" inverse="false" table="relationship_1">
            <key>
                <column name="IDUser" not-null="true" />
            </key>
            <many-to-many entity-name="model.Stamp">
                <column name="CatalogID" not-null="true" />
            </many-to-many>
        </set>
    </class>
</hibernate-mapping>



[ nemnesic @ 07.09.2011. 21:47 ] @
upload-uj Controler


a za crtanje slike nesto ovako ubaci

Code:

byte[] bytearray = new byte[4096];
int size=0;
InputStream image;
image = rs.getBinaryStream(1);
response.reset();
response.setContentType("image/gif");

while((size=image.read(bytearray))!= -1 ){
response.getOutputStream().write(bytearray,0,size);

response.flushBuffer();
image.close();
rs.close();


[ fedzy @ 07.09.2011. 21:54 ] @

Controler.java

Code:

package model;

import java.util.List;


import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.HibernateException;
import java.text.*;
import java.util.*;

public class Controler {

      private static final SessionFactory sessionFactory;
      private static final ThreadLocal threadSession =new ThreadLocal();
      private static final ThreadLocal threadTransaction = new ThreadLocal();
      
      static {
        try {
          Configuration cfg = new Configuration().configure(Controler.class.getResource(
            "/model/hibernate.cfg.xml"));
             sessionFactory = cfg.buildSessionFactory();
        } catch (Throwable ex) {
          
          throw new ExceptionInInitializerError(ex);
        }
      }
      
      public static void beginTransaction() {
        Transaction tx = (Transaction) threadTransaction.get();
        if (tx == null) {
          tx = getSession().beginTransaction();
          threadTransaction.set(tx);
        }
      }
        
      public static void closeSession() {
        Session s = (Session) threadSession.get();
        threadSession.set(null);
        if (s != null && s.isOpen())
          s.close();
      }
        
      public static void commitTransaction() {
        Transaction tx = (Transaction) threadTransaction.get();
        if ( tx != null && !tx.wasCommitted() && !tx.wasRolledBack() ){
          tx.commit();
        }
        threadTransaction.set(null);
      }
      
          public static Session getSession() {
            Session s = (Session) threadSession.get();
            if (s == null) {
                s = sessionFactory.openSession();
                threadSession.set(s);
            }
            s.clear();
            return s;
          }

        public static void rollbackTransaction() {
            Transaction tx = (Transaction) threadTransaction.get();
            threadTransaction.set(null);
            if ( tx != null && !tx.wasCommitted() && !tx.wasRolledBack() ) {
              tx.rollback();
            }
            closeSession();
          } 
        
        public static boolean saveUser(User user) {
            try {
                beginTransaction();
                Session s = getSession();
                s.saveOrUpdate(user);
                commitTransaction();
                closeSession();
                return true;
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            }

        }
        
        
        
        
        public static boolean saveStamp(Stamp stamp ) {
            try {
                beginTransaction();
                Session s = getSession();
                s.saveOrUpdate(stamp);
                commitTransaction();
                closeSession();
                return true;
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            }

        }
        
        
        public static boolean saveSeries(Series series) {
            try {
                beginTransaction();
                Session s = getSession();
                s.saveOrUpdate(series);
                commitTransaction();
                closeSession();
                return true;
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            }

        }
        
        
        public static boolean deleteUser(User user) {
            try {
                beginTransaction();
                Session s = getSession();
                s.delete(user);
                commitTransaction();
                closeSession();
                return true;
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            }

        }
        
        public static boolean deleteStamp(Stamp stamp) {
            try {
                beginTransaction();
                Session s = getSession();
                s.delete(stamp);
                commitTransaction();
                closeSession();
                return true;
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            }

        }
        
        public static boolean deleteSeries(Series series) {
            try {
                beginTransaction();
                Session s = getSession();
                s.delete(series);
                commitTransaction();
                closeSession();
                return true;
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            }

        }
        
        public static User getUser(int iduser) {
            try {
                beginTransaction();
                Session s = getSession();
                Query q = s.createQuery("from User u where u.iduser=:id");
                q.setInteger("id", iduser);
                List l = q.list();
                User u = (User) l.get(0);
                commitTransaction();
                //closeSession();
                return u;
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }

        }
        
        
        public static Stamp getStamp(int catalogId) {
            try {
                beginTransaction();
                Session s = getSession();
                Query q = s.createQuery("from Stamp st where st.catalogId=:id");
                q.setInteger("id", catalogId);
                List l = q.list();
                Stamp stamp = (Stamp) l.get(0);
                commitTransaction();
                //closeSession();
                return stamp;
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }

        }
        
        public static Series getSeries(String seriesId) {
            try {
                beginTransaction();
                Session s = getSession();
                Query q = s.createQuery("from Series se where se.seriesId=:id");
                q.setString("id", seriesId);
                List l = q.list();
                Series se = (Series) l.get(0);
                commitTransaction();
                //closeSession();
                return se;
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }

        }
        
        public static List<Series> getSeries(){
            try{
                beginTransaction();
                Session s=getSession();
                Query q=s.createQuery("from Series s ");
                List<Series>l=q.list();
                Series serija=(Series)l.get(0);
                commitTransaction();
                closeSession();
                return l;
            }catch(Exception e){
                e.printStackTrace();
                return null;
                        
            }            
            
        }
        
        public static List getAllStamps() {
            try {
                beginTransaction();
                Session s = getSession();
                Query q = s.createQuery("from Stamp");
                List l = q.list();
                commitTransaction();
                //closeSession();
                return l;
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }

        }
    
        public static User getUser(String userName,String userPassword) {
            try {
                beginTransaction();
                Session s = getSession();
                Query q = s.createQuery("from User u where u.userName=:userName and u.userPassword=:userPassword");
                q.setString("userName", userName);
                q.setString("userPassword", userPassword);
                List l = q.list();
                User u = (User)l.get(0);
                commitTransaction();
                return u;
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }

        }
        
        
}
        
[ biske86 @ 08.09.2011. 11:06 ] @
Citat:
fedzy: Pozdrav,
3.Spomenuo sam vec da su Stamp I User povezani vezom vise prema vise, ali kada snimim marku u bazu u relacionoj tabeli izmedju Stamp i User se ne snimaju strain kljucevi. Zapravo sve funcionise kao jedan prema vise veza. Petpostavljam da treba nesto da podesim u hbm fajlovima ali ne znam sta.

Ovo su za sada jedini problemi. Svaka pomoc ili savet je dobrodosla. Hvala unapred.


Ne znam kako je to u Hibernate ORM možda on ima neku foru da prevede to, ali kod većine relacionih baza podataka nije moguća relacija više prema više. Kada imaš potrebu da između dva entiteta imaš takvu vrstu veze onda se ta dva entiteta razbijajaju na tri tj. dodaje se između njih takozvana spojna (junction) tabela, ili kako se ponekad naziva slab entitet. Pogledaj ovo: http://en.wikipedia.org/wiki/Many-to-many_(data_model)
[ nemnesic @ 08.09.2011. 18:06 ] @
photo treba da bude BLOB
i onda nesto ovako

Code:

//servlet
String id = req.getParameter("id");
Stamp marka = Controler.getStamp(broj);
Blob image = //retrieve Blob from BD (can identifier with id).
OutputStream os = request.getOutputStream();
BufferedImage bi = ImageIO.read(image.getBinaryStream());
ImageIO.write(bi, "jpeg", os);

//jsp
<img src="ImageServlet?id=${imageId}" />




nemoj da stavljas logic u jsp.
ovo radi ali nije dobro.
Odradi ovo u servlet i posalji nazad List<Series>

Code:

<td>Serija</td>
        <td><select name="cboxserije">
      <%List <Series> ls=Controler.getSeries();
      for (int i=0;i<ls.size();i++){ 
       String  seriesId=ls.get(i).getSeriesId() ;    
       %>  <option value="<%=seriesId %>"selected="selected"> <%=ls.get(i).getSeriesDescription()%></option>
        <%}%>
      </select></td>


a sto se many-to-many tice predji na hibernate annotations. mnogo je lakse i preglednije od xml-a.
[ fedzy @ 13.09.2011. 14:15 ] @
Namestio sam ucitavanje slike. Zapravo je ceo kod bio dobar, ali Imageservlet nisam definisao u web.xml fajlu.

u web.xml treba dodati
Code:


<servlet>
     <servlet-name>ImageServlet</servlet-name>
     <servlet-class>model.ImageServlet</servlet-class>
    </servlet>
    <servlet-mapping>
     <servlet-name>ImageServlet</servlet-name>
     <url-pattern>/ImageServlet</url-pattern>
    </servlet-mapping>    



---
Combo-box sam takodje namestio.

Code:


<td><select name="cboxserije">
      <%
      String serija=marka.getSeries().getSeriesId();
      List <Series> ls=Controler.getSeries();
      for (int i=0;i<ls.size();i++){ 
       String  seriesId=ls.get(i).getSeriesId() ;  
       
       if (serija.equals(seriesId)){
        %>         
         <option value="<%=seriesId %>"selected="selected" > <%=ls.get(i).getSeriesDescription()%></option>
        <%}%>       
        <%
        if (!serija.equals(seriesId)){
          %>        
         <option value="<%=seriesId %>"> <%=ls.get(i).getSeriesDescription()%></option>
        <%}%>             
     <%}%>
      </select></td>



[Ovu poruku je menjao fedzy dana 13.09.2011. u 22:29 GMT+1]

[Ovu poruku je menjao fedzy dana 13.09.2011. u 22:32 GMT+1]
[ fedzy @ 21.09.2011. 13:59 ] @
Imam jedan neobican problem

Kod apdejta marke aplikacija "ne vidi" da sam kliknuo na dugme "Save". Tj vrednost parametra je stalno NULL. Slicno je i sa delete.


Code:

<% if (update && exist){ 
System.out.println("U IF-u inputa");%>
<input type="submit" name="saveup" value="Sacuvaj">&nbsp;&nbsp;
<input type="submit" name="delete" value="Obrisi" >&nbsp;&nbsp;
<%}
System.out.println("parameta save u input = "+ request.getParameter("saveup"));

%>



prodje obe provere update && exist, udje u IF ali vrednost equest.getParameter("saveup")) je null.