persistencia - querys hibernate
Hibernate no crea automáticamente una tabla que no existe en la base de datos (9)
- Primero, verifique su versión de MySQL con
$mysql --version $mysql Ver 14.14 Distrib 5.5.11
Luego cambia el dialecto en consecuencia
- luego cambie la propiedad del dialecto / Para este ejemplo le he dado a
MySQL55Dialect/ org.hibernate.dialect.MySQL55Dialect
//////////////////////////////////////////////// - Donde puedes encontrar dialecto:
org.hibernate.dialect
try
import org.hibernate.dialect.ctrl+space
you find option
Espero que esto ayude
Tengo un código de Hibernate básico, configuré la propiedad "hibernate.hbm2ddl.auto" ya que la actualización aún no crea automáticamente la tabla en la Base de datos.
Estos son los archivos requeridos:
employee.hbm.xml
<hibernate-mapping>
<class name="contacts.employee" table="contacts">
<meta attribute="class-description"></meta>
<id column="contactId" name="contactId" type="string">
<generator class="assigned"/>
</id>
<property column="contactName" length="100" name="contactName" not-null="true" type="string"/>
<property column="password" length="100" name="password" not-null="true" type="string"/>
<set cascade="all" name="groupOfResponsibilities" table="employee_responsibilty">
<key column="contactId"/>
<many-to-many class="contacts.responsibilities" column="responsibilityId"/>
</set>
</class>
</hibernate-mapping>
responsabilidad.hbm.xml
<hibernate-mapping>
<class name="contacts.responsibilities" table="responsibilities">
<meta attribute="class-description">
This class list of responsibilities if an employee
</meta>
<id column="responsibilityId" name="responsibilityId" type="long">
<generator class="increment"/>
</id>
<property column="responsibilityName" name="responsibilityName" type="string"/>
</class>
</hibernate-mapping>
hibernate.cfg.xml
<hibernate-configuration>
<session-factory>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/****</property>
<property name="hibernate.connection.username">*****</property>
<property name="hibernate.connection.password">*****</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<property name="hibernate.show_sql">true</property>
<mapping resource="contacts/employee.hbm.xml"/>
<mapping resource="contacts/responsibilitiy.hbm.xml"/>
</session-factory>
</hibernate-configuration>
Este es el Main.java que estoy tratando de ejecutar:
public class Main {
public static void main(String[] args) {
SessionFactory sessionfactory = NewHibernateUtil.getSessionFactory();
Transaction transaction = null;
try {
Session session = sessionfactory.openSession();
transaction = session.beginTransaction();
Set<responsibilities> groups = new HashSet<responsibilities>();
responsibilities responsibilityOne=new responsibilities("Java");
responsibilities responsibilityTwo=new responsibilities("SQL");
responsibilities responsibilityThree=new responsibilities("Oracle");
groups.add(responsibilityOne);
groups.add(responsibilityTwo);
groups.add(responsibilityThree);
String uuid = UUID.randomUUID().toString();
String uuid2 = UUID.randomUUID().toString();
employee firstEmployee;
firstEmployee = new employee(uuid, "Mike", groups);
employee secondEmployee = new employee(uuid2, "Marc", groups);
session.save(responsibilityOne);
session.save(responsibilityTwo);
session.save(responsibilityThree);
session.save(firstEmployee);
session.save(secondEmployee);
transaction.commit();
} catch (HibernateException e) {
transaction.rollback();
e.printStackTrace();
} finally {
}
}
}
Este es el error que recibo:
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: la tabla '' * * .responsibilities'' no existe
¿Por qué no intentas crear o crear-soltar en su lugar? Parece servir a tu propósito. http://docs.jboss.org/hibernate/core/3.3/reference/en/html/session-configuration.html#configuration-optional
El siguiente escenario podría ser otra razón por la que Hibernate no puede crear automáticamente su tabla:
@Entity
public class Employee {
@Id
@GeneratedValue
private String empID;
private String name;
}
La tabla Employee
no será creada automáticamente por Hibernate ya que empID
es una String
y tiene la anotación @GeneratedValue
. empID
debe ser un int
o long
. En algún momento tuve este problema y cambié mi campo de id
que tenía la anotación @GeneratedValue
para ser de tipo int
y Hibernate creó la tabla automáticamente.
Hibernate puede crear tablas, secuencias de hibernaciones y tablas utilizadas para la asignación de muchos a muchos en su nombre, pero tiene que configurarlo explícitamente llamando a setProperty ("hibernate.hbm2ddl.auto", "crear") del objeto de configuración. De forma predeterminada, simplemente valida el esquema con la base de datos y falla si aún no existe algo al dar el error "ORA-00942: la tabla o la vista no existen".
Para el entorno de trabajo existente, o para cualquier área de aplicación grande, no se recomienda configurar hibernate.hbm2ddl.autoon create o create-drop , como se muestra a continuación
<property name="hibernate.hbm2ddl.auto">create-drop</property>
aunque funciona, pero eliminará todas las tablas existentes de la base de datos cada vez que reinicie el servidor.
Si está utilizando la versión 5.2.0 de hibernate jar, entonces cambie a una versión inferior o cualquier otra. Esta versión de jar tiene algún problema con respecto a la actualización.
Funcionó para mí y espero que funcione también para otros.
Solo haz la configuración correcta
1) Crear, Cada vez que se creará una nueva tabla. Todos los datos antiguos serán eliminados.
<property name="hibernate.hbm2ddl.auto">create</property>
2) Actualizar, si alguna modificación se ha realizado, lo mismo se reflejará en DB.
<property name="hibernate.hbm2ddl.auto">update</property>
Tuve el mismo problema, esto me funcionó -
<property name="hibernate.hbm2ddl.auto">create</property>
Tuve el mismo problema, lo resolví cambiando:
org.hibernate.dialect.MySQLInnoDBDialect
a
org.hibernate.dialect.MySQLDialect
Encontré la solución en esta pregunta .
Tuve el mismo problema, pero para mí la solución fue:
<property name="hibernate.hbm2ddl.auto">create-drop</property>
en lugar de
<property name="hibernate.hbm2ddl">create-drop</property>