使用MySQL 5.1配置Hibernate 4时遇到问题

时间:2012-03-06 21:39:10

标签: java mysql hibernate junit

有没有人有一个成功的hibernate.cfg.xml配置文件的例子,他们使用Hibernate 4和MySQL 5.1?我有一个Maven(v3.0.3)Web项目,当我运行JUnit测试时,测试失败并出现异常,即使表USERS存在......

org.hibernate.AnnotationException: @org.hibernate.annotations.Table references an unknown table: USERS
    at org.hibernate.cfg.annotations.EntityBinder.processComplementaryTableDefinitions(EntityBinder.java:875)
    at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:710)
    at org.hibernate.cfg.Configuration$MetadataSourceQueue.processAnnotatedClassesQueue(Configuration.java:3406)
    at org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(Configuration.java:3360)
    at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1334)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1724)
    at com.myco.eventmaven.dao.UsersDaoImpl.<init>(UsersDaoImpl.java:27)
    at com.myco.eventmaven.dao.UsersDaoImplTest.setUpStaticVars(UsersDaoImplTest.java:19)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:27)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
    at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:53)
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:123)
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:104)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:164)
    at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:110)
    at org.apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.java:175)
    at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcessWhenForked(SurefireStarter.java:107)
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:68)

这是我的hibernate.cfg.xml文件......

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/eventmaven</property>
<property name="hibernate.connection.username">eventmaven</property>
<property name="hibernate.connection.password">password</property>
<property name="hibernate.connection.pool_size">10</property>
<property name="show_sql">true</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>

<mapping class="com.myco.eventmaven.domain.Registration" />

</session-factory>
</hibernate-configuration>

奇怪的是,即使我将URL,用户名或密码更改为绝对不正确的值,我也会得到相同的异常。这是我试图绑定到的类的声明...

package com.myco.eventmaven.domain;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.validation.constraints.Size;

import org.hibernate.annotations.Table;
import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.NotEmpty;

@Entity
@Table(appliesTo = "USERS")
public class Registration implements Serializable {

@Id
@Column(name = "ID")
Integer id;

@Column(name = "USERNAME")
private String userName;
@NotEmpty
@Size(min = 4, max = 20)
@Column(name = "PASSWORD")
private String password;
@NotEmpty
private String confirmPassword;
@NotEmpty
private String salt;
@NotEmpty
@Email
@Column(name = "EMAIL")
private String email;
@Column(name = "FIRST_NAME")
private String firstName;
@Column(name = "LAST_NAME")
private String lastName;

public void setUserName(String userName) {
    this.userName = userName;
}

public String getUserName() {
    return userName;
}

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

public String getPassword() {
    return password;
}

public void setConfirmPassword(String confirmPassword) {
    this.confirmPassword = confirmPassword;
}

public String getConfirmPassword() {
    return confirmPassword;
}

public String getSalt() {
    return salt;
}

public void setSalt(String salt) {
    this.salt = salt;
}

public void setEmail(String email) {
    this.email = email;
}

public String getEmail() {
    return email;
}

public Integer getId() {
    return id;
}

public void setId(Integer id) {
    this.id = id;
}

public String getFirstName() {
    return firstName;
}

public void setFirstName(String firstName) {
    this.firstName = firstName;
}

public String getLastName() {
    return lastName;
}

public void setLastName(String lastName) {
    this.lastName = lastName;
}

}

谢谢, - 戴夫

3 个答案:

答案 0 :(得分:5)

该表确实存在,但我使用的注释是错误的。我需要使用注释

@Table(name = "USERS")

其中@Table是从导入javax.persistence.Table;中导入的。在从org.hibernate包中导入@Table之前,这很糟糕。

答案 1 :(得分:0)

您没有连接问题 - 您的日志很明确:没有表USERS。 为什么在另一个文件中使用@Table(applyTo =“USERS”),至少最好在它的实体定义之前定义它。

你没有在hibernate映射文件中包含表USERS。

@Table API

答案 2 :(得分:0)

您可能遇到区分大小写的问题,使用某些操作系统,表名在MySQL中可能区分大小写。来自8.2.2. Identifier Case Sensitivity(我的重点):

  

在MySQL中,数据库对应于数据中的目录   目录。数据库中的每个表对应至少一个   数据库目录中的文件(可能更多,取决于   存储引擎)。触发器也对应于文件。所以,   底层操作系统的区分大小写是其中的一部分   在数据库,表和触发器名称的敏感性的情况下。 :此   意味着这些名称在Windows中不区分大小写,但都是大小写   在大多数Unix版本中都很敏感。一个值得注意的例外是Mac OS   X,它是基于Unix的,但使用默认的文件系统类型(HFS +)   不区分大小写。但是,Mac OS X也支持UFS卷,   像任何Unix一样区分大小写。见1.8.4节,   “标准SQL的MySQL扩展”。 lower_case_table_names   系统变量也会影响服务器处理标识符的情况   灵敏度。

因此请检查表名,检查它们最初是如何创建的。链接页面有很多关于如何处理这个问题的选项。