Codificación de caracteres JDBC

Tengo una aplicación web Java ejecutándose en GlassFish 3 y JPA (EclipseLink) en MySQL. El problema al que me enfrento es que si guardo entidades en la base de datos con el método update() , los campos String pierden integridad; '?' se muestra en lugar de algunos caracteres.

El servidor, las páginas y la base de datos están configurados para usar UTF-8 .

Después de publicar los datos del formulario, la página siguiente muestra los datos correctamente. Además, “parece” en la depuración NetBeans que la propiedad String de la entidad actual también almacena el valor correcto. No sé si se puede confiar en la depuración de NetBeans; podría ser que se decodifica correctamente, sin embargo es incorrecto.

Es JDBC, no JPA, lo que determina la encoding:

 jdbc:mysql://localhost:3306/administer?characterEncoding=utf8 

Lo resolví con lo siguiente: utilicé la interfaz de administración GlassFish para agregar esta propiedad a la configuración de mi grupo de conexiones:

characterEncoding = UTF-8

La nueva versión del controlador JDBC detecta automáticamente la encoding de caracteres. No necesita configurarlo explícitamente.

Tuve que agregar useUnicode = true también, así que tuve que concaturar los parámetros con ‘&’ para que se vea así:

 jdbc:mysql://127.0.0.1:3306/warranteer?useUnicode=true&characterEncoding=UTF-8 

Si está utilizando perfiles de maven para establecer la URL de MySQL, como yo, asegúrese de poner & en cambio & porque mapea unescape la url al escribir el archivo persistence.xml en la carpeta de clases.