【问题标题】:JPA EntityManager and character encodingJPA EntityManager 和字符编码
【发布时间】:2015-02-22 12:47:22
【问题描述】:

我第一次使用 JSP、Servlet、Tomcat 服务器、MySQL 和 Netbeans(如果有帮助的话)创建一个简单的网站。

感谢 JPA EntityManager,我可以像这样将数据插入到我的数据库中:

    EntityManager entityManager = Persistence.createEntityManagerFactory("test").createEntityManager();
    entityManager.getTransaction().begin();
    entityManager.persist(usr);
    entityManager.getTransaction().commit();

其中 usr 是一个由 Netbeans 生成的实体类 User。 除了不支持重音等字符之外,一切都运行良好。

假设我想插入“陈词滥调”:

  • 如果我尝试打印 User 类中的值,一切都很好。
  • 发送值时,如果我尝试从基数中选择值,我会得到奇怪的字符而不是“é”

数据库字段是 utf8_unicode_ci。如果我尝试从 MySQL 提示符中进行简单的 INSERT,例如

INSERT INTO table (name) VALUES("ééé");

效果很好。

当我在一些网站上阅读时,我用以下行修改了我的 persistence.xml

<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=UTF-8&amp;characterSetResults=UTF-8&amp;zeroDateTimeBehavior=convertToNull"/>

但结果是一样的。

编辑:这是我的用户类

的属性
@Entity
@Table(name = "users")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Users.findAll", query = "SELECT u FROM Users u"),
    @NamedQuery(name = "Users.findByIdUsers", query = "SELECT u FROM Users u WHERE u.idUsers = :idUsers"),
    @NamedQuery(name = "Users.findByUsername", query = "SELECT u FROM Users u WHERE u.username = :username"),
    @NamedQuery(name = "Users.findByPasswd", query = "SELECT u FROM Users u WHERE u.passwd = :passwd"),
    @NamedQuery(name = "Users.findByFirstName", query = "SELECT u FROM Users u WHERE u.firstName = :firstName"),
    @NamedQuery(name = "Users.findByLastName", query = "SELECT u FROM Users u WHERE u.lastName = :lastName"),
    @NamedQuery(name = "Users.findByEmail", query = "SELECT u FROM Users u WHERE u.email = :email"),
    @NamedQuery(name = "Users.findByEmailAndPwd", query = "SELECT u FROM Users u WHERE u.email = :email AND u.passwd = :passwd")})
public class Users implements Serializable {
    @Basic(optional = false)
    @Column(name = "address")
    private String address;
    @Basic(optional = false)
    @Column(name = "city")
    private String city;
    @Basic(optional = false)
    @Column(name = "postal")
    private String postal;
    @Basic(optional = false)
    @Column(name = "phone")
    private String phone;
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "idUsers")
    private Integer idUsers;
    @Basic(optional = false)
    @Column(name = "username")
    private String username;
    @Basic(optional = false)
    @Column(name = "passwd")
    private String passwd;
    @Basic(optional = false)
    @Column(name = "firstName")
    private String firstName;
    @Basic(optional = false)
    @Column(name = "lastName")
    private String lastName;
    @Basic(optional = false)
    @Column(name = "email")
    private String email;

当我在网上阅读时,我还尝试通过添加以下行来修改我的 catalina.bat,但它没有改变任何东西。

设置 JAVA_OPTS=%JAVA_OPTS% -Djavax.servlet.request.encoding=UTF-8 -Dfile.encoding=UTF-8

非常感谢任何帮助。

【问题讨论】:

  • 在 Glassfish 中,我在 WEB-INF 上使用它-->glassfish-web.xml 也许它在 tomcat 中类似
  • 我找不到 Tomcat 的类似属性
  • 我看不出你的代码有什么问题,所以我会长篇大论:你使用的是什么版本的 MySQL?您使用的是什么版本的 MySQL JDBC 驱动程序?你到底看到了什么奇怪的字符? (你有没有看到cliché?)
  • @VGR 我的 MySQL 版本是 5.6(最后一个)。对于驱动程序,版本为 5.1.34。正如你所说,字符是“é”的“é”
  • "é" 是代表“é”的两个 UTF-8 字节的 Latin-1 解释。这让我想知道您的列和/或表格是否实际上使用的是 Latin-1(又名 ISO 8859-1)。使用非拉丁 1 字符的语句是否有效,例如 INSERT INTO table (name) VALUES("↑↑↑");

标签: java mysql jpa jpql


【解决方案1】:

感谢 VGR 在这里的回答,我能够解决我的问题:HttpServletRequest UTF-8 Encoding

非常感谢您的帮助。

【讨论】:

  • 对于所有未来的读者,请注意这是一种解决方法,而不是解决方案。
【解决方案2】:

尝试在您的 persistence.xml 中添加此配置

<property name="hibernate.connection.characterEncoding">utf8</property>
<property name="hibernate.connection.useUnicode">true</property>
<property name="hibernate.connection.charSet">UTF-8</property> 

【讨论】:

  • 感谢您的回答,但我使用的是没有 Hibernate 的 JPA。
【解决方案3】:

您可以在 web.xml 中添加 unicode 编码过滤器:

  <filter>
    <filter-name>CharsetFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
      <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
      </init-param>
      <init-param>
       <param-name>forceEncoding</param-name>
       <param-value>true</param-value>
     </init-param>
  </filter>

如果你使用 Spring,你可以使用 'org.springframework.web.filter.CharacterEncodingFilter' 类对所有请求进行编码,否则你应该使用其他编码类。

【讨论】:

    猜你喜欢
    • 2016-06-07
    • 2013-05-06
    • 1970-01-01
    • 2014-01-30
    • 2023-03-23
    • 2018-01-20
    • 2013-07-25
    • 1970-01-01
    • 2023-04-11
    相关资源
    最近更新 更多