[JEE] Kodowanie znaków

0

Zaraz pewnie polecą teksty typu "wujek google zna odpowiedź", ale już chyba wszystkie możliwości wypróbowałem i nie wiem gdzie jest błąd. Wstawię trochę kodu a potem wytłumaczę.

Formularz z którego przekazuję zmienne


(...)
        <h:form>
            <table width="100%" cellpadding="4">
                <tr>
                    <td bgcolor="#808080"><font color="#FFFFFF"><b>Odpowiedz</b></font></td>
                    <td align="left" bgcolor="#C0C0C0">
                        Nadawca:<br /> <h:inputText id="author" style="WIDTH: 99%" value="#{forumBean.post.author}" onfocus="if(this.value=='' || this.value == 'Anonim') this.value=''" onblur="if(this.value == '') {this.value=this.defaultValue}" onkeyup="keyUp();" required="true" />
                    </td>
                </tr>

                <tr>
                    <td colspan="2" bgcolor="#808080"><font color="#FFFFFF"><b>Treść postu:</b></font><br /><h:inputTextarea id="text" value="#{forumBean.post.text}" required="true" style="WIDTH: 99%; HEIGHT: 113px" rows="5" cols="44" /></td>
                </tr>

                <tr>
                    <td bgcolor="#C0C0C0" colspan="2"><h:commandButton action="#{forumBean.addPost}" value="Wyślij" /></td>
                </tr>

                <!--<tr><td>&nbsp</td></tr>-->

            </table>

        </h:form>

Metoda odczytująca i zapisująca dane w bazie

    public List<Post> getPosts() {
        EntityManager em = DBManager.getManager().createEntityManager();
        List list = em.createQuery("SELECT p FROM Post p WHERE p.topic = " + this.topic.getId()).getResultList();
        em.close();
        return list;
    }

    public String addPost() {
        EntityManager em = DBManager.getManager().createEntityManager();
        em.getTransaction().begin();
        post.setId(null);
        post.setDate(new Date());
        post.setTopic(this.topic.getId());
        String timestamp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
        em.createQuery("UPDATE Topic t SET t.lastpost='" + timestamp + "' WHERE t.id=" + this.topic.getId()).executeUpdate();

        em.persist(post);
        em.getTransaction().commit();
        em.close();
        this.post = new Post();
        return "topic.xhtml";
    }

Klasa DBManager

package okb.intranet.config;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
/**
 *
 * @author Krzysztof
 */
public class DBManager {
    private static DBManager instance;
    private EntityManagerFactory emf;
    private DBManager(){}

    public synchronized static DBManager getManager(){
        if(instance == null)
            instance = new DBManager();
        return instance;
    }
    public EntityManagerFactory createEntityManagerFactory(){
        if(emf == null)
            emf = Persistence.createEntityManagerFactory("IntranetPU");
        return emf;
    }
    public EntityManager createEntityManager(){
        return this.createEntityManagerFactory().createEntityManager();
    }
    public void closeEntityManagerFactory(){
        if(emf != null)
            emf.close();
    }
}

Problem w tym, że podczas zapisywania danych do bazy, zamiast polskich liter zapisuje znaki zapytania. Jeżeli chodzi o odczyt danych i ich wyświetlenie wszystko jest OK, więc przypuszczam, że jest jakiś problem w metodzie addPost(). Używam frameworków Hibernate(JPA) i JSF, ścieżka do bazy danych w pliku konfiguracyjnym hibernate.cfg.xml to jdbc//localhost/dbname?useUnicode=yes&characterEncoding=UTF-8&autoReconnect=true. Ma ktoś jakiś pomysł ??

0

A jak wygląda string przed dodaniem do bazy? Może coś isć nie tak z przeglądarki już.

0

OK, poradziłem sobie, chociaż jestem jeszcze zbyt świeży w tym temacie. Nie wiem po co plik hibernate.cfg.xml jak jest persistence.xml i właśnie w pliku persistence.xml trzeba było dodać "?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true" a nie tak jak zrobiłem to wcześniej w pliku hibernate.cfg.xml.

Koziołek, wszystko inne było kodowane w UTF-8, sprawdzałem nawet, czy prawidłowo transportuje dane z pliku xhtml do ManagedBean'a i wszystko OK. Normalnie pół dnia nad tym siedzę. Dzięki za zainteresowanie i pozdrawiam :)

0

hibernate.cfg.xml powinien zawierać konfigurację specyficzna dla hibernate, której nie włączasz do persistence.xml jeżeli chcesz zachować możliwość wymiany dostawcy JPA.
łapaj to:
http://www.coderanch.com/t/217462/ORM/java/Hibernate-Persistence-xml

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