Проблемы с настройкой Hibernate 4 с MySQL 5.1 - PullRequest
0 голосов
/ 07 марта 2012

У кого-нибудь есть пример успешного файла конфигурации hibernate.cfg.xml, где они используют Hibernate 4 и MySQL 5.1?У меня есть веб-проект Maven (v3.0.3), и когда я запускаю свой тест 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)

Вот мой спящий режим.cfg.xml file ...

<?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 ]

5 голосов
/ 07 марта 2012

Таблица существует, но аннотация, которую я использовал, была неверной. Мне нужно было использовать аннотацию

@Table(name = "USERS")

, в котором @Table был импортирован из импорта javax.persistence.Table ;. До того как @Table был импортирован из пакета org.hibernate, и это все испортило.

0 голосов
/ 07 марта 2012

У вас могут быть проблемы с чувствительностью к регистру, в некоторых операционных системах имена таблиц могут быть чувствительными к регистру в MySQL. От 8.2.2. Идентификатор регистра чувствительности (мой акцент):

В MySQL базы данных соответствуют каталогам в данных каталог. Каждая таблица в базе данных соответствует как минимум одному файл в каталоге базы данных (и, возможно, больше, в зависимости от двигатель хранения). Триггеры также соответствуют файлам. Как следствие, чувствительность к регистру базовой операционной системы играет роль в чувствительности к регистру имен баз данных, таблиц и триггеров. Это означает, что такие имена не чувствительны к регистру в Windows, но регистр чувствителен в большинстве разновидностей Unix. Одним заметным исключением является Mac OS X, основанный на Unix, но использующий тип файловой системы по умолчанию (HFS +), который не чувствителен к регистру. Тем не менее, Mac OS X также поддерживает тома UFS, которые чувствительны к регистру, как и в любом Unix. См. Раздел 1.8.4, «Расширения MySQL для стандартного SQL». lower_case_table_names Системная переменная также влияет на то, как сервер обрабатывает регистр идентификаторов. чувствительность.

Итак, проверьте имена таблиц, проверьте, как они были изначально созданы. На связанной странице есть несколько вариантов решения этой проблемы.

0 голосов
/ 07 марта 2012

У вас нет проблем с подключением - ваш лог понятен: таблицы USERS нет.Зачем использовать @Table (applyTo = "USERS") в другом файле, по крайней мере, лучше определить его до определения его сущности.

У вас нет таблицы USERS, включенной в файл отображения гибернации.

@ Table API

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...