java - registro - insertar con hibernate
¿Ubicación de hibernate.cfg.xml en el proyecto? (10)
Creé un proyecto con la siguiente estructura:
HibernateUtil:
public class HibernateUtil {
private static final SessionFactory sessionFactory = buildSessionFactory();
private static SessionFactory buildSessionFactory() {
try {
// Create the SessionFactory from hibernate.cfg.xml
Configuration configuration = new Configuration().configure( "C://Users//Nikolay_Tkachev//workspace//hiberTest//src//logic//hibernate.cfg.xml");
return new Configuration().configure().buildSessionFactory();
} catch (Throwable ex) {
// Make sure you log the exception, as it might be swallowed
System.err.println("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
public static void shutdown() {
// Close caches and connection pools
getSessionFactory().close();
}
}
en línea
Configuration configuration = new Configuration().configure( "C://Users//Nikolay_Tkachev//workspace//hiberTest//src//logic//hibernate.cfg.xml");
Tengo error
Excepción en la creación de SessionFactory.org.hibernate.HibernateException: C: / Users / Nikolay_Tkachev / workspace / hiberTest / src / logic / hibernate.cfg.xml No se encuentra Exception en el hilo "main" java.lang.ExceptionInInitializerError at logic.Hect (HibernateUtil.java:19) en logic.HibernateUtil. (HibernateUtil.java:9) en logic.Main.main (Main.java:12) Causado por: org.hibernate.HibernateException: C: / Users / Nikolay_Tkachev / workspace / hiberTest / src / logic / hibernate.cfg.xml no se encontró en org.hibernate.internal.util.ConfigHelper.getResourceAsStream (ConfigHelper.java:173) en org.hibernate.cfg.Configuration.getConfigurationInputStream org.hibernate.cfg.Configuration.configure (Configuration.java:1928) en logic.HibernateUtil.buildSessionFactory (HibernateUtil.java:14) ... 2 más
¿Cuál es la razón del error y cómo lo soluciono?
De alguna manera, colocar en la carpeta "src" no me funcionó.
En lugar de colocar cfg.xml como a continuación:
[Project Folder]/src/main/resources/hibernate.cfg.xml
trabajó. Usando este codigo
new Configuration().configure().buildSessionFactory().openSession();
en un archivo bajo
[Project Folder]/src/main/java/com/abc/xyz/filename.java
Además tiene este fragmento de código en hibernate.cfg.xml
<mapping resource="hibernate/Address.hbm.xml" />
<mapping resource="hibernate/Person.hbm.xml" />
Coloca los archivos hbm.xml anteriores debajo de:
EDITAR:
[Project Folder]/src/main/resources/hibernate/Address.hbm.xml
[Project Folder]/src/main/resources/hibernate/Person.hbm.xml
Sobre estructura trabajada.
En el caso de un Proyecto Maven, cree una carpeta llamada recursos en la carpeta src / main y agregue la carpeta de recursos como una carpeta de origen en su ruta de clase.
Puede hacerlo yendo a Configurar ruta de acceso de compilación y luego haciendo clic en Agregar carpeta a la pestaña Fuentes.
A continuación, compruebe la carpeta de recursos y haga clic en Aplicar.
Luego solo usa:
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
Este es un ejemplo de realidad cuando personaliza la estructura de carpetas: estructura de carpetas e inicializa la clase HibernateUtil
con:
return new Configuration().configure("/config/hibernate.cfg.xml").buildSessionFactory();
con personalizar los archivos de mapeo de entidades:
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="show_sql">true</property>
<mapping class="com.vy.entities.Users"/>
<mapping class="com.vy.entities.Post"/>
<mapping resource="config/Users.hbm.xml"/>
<mapping resource="config/Post.hbm.xml"/>
</session-factory>
</hibernate-configuration>
(Nota: la forma más sencilla, si sigue la forma predeterminada, significa que debe colocar todos los archivos de configuración XML en la carpeta src
, cuando compile sessionFactory, solo:
return new Configuration().configure().buildSessionFactory();
)
Indique el camino relativo a su proyecto.
Cree una carpeta llamada resources
en su src
y ponga allí su archivo de configuración.
configuration.configure("/resources/hibernate.cfg.xml");
Y si compruebas tu código
Configuration configuration = new Configuration().configure( "C://Users//Nikolay_Tkachev//workspace//hiberTest//src//logic//hibernate.cfg.xml");
return new Configuration().configure().buildSessionFactory();
En dos líneas estás creando dos objetos de configuración.
Eso debería funcionar (no he probado) si escribes,
Configuration configuration = new Configuration().configure( "C://Users//Nikolay_Tkachev//workspace//hiberTest//src//logic//hibernate.cfg.xml");
return configuration.buildSessionFactory();
Pero falla después de implementar en el servidor, ya que está utilizando la ruta del sistema que la ruta relativa del proyecto.
Intenta a continuación el código que solucionará tu problema.
Configuration configuration = new Configuration().configure("/logic/hibernate.cfg.xml");
Mi problema fue que tenía un padre excelente en la carpeta de recursos. Después de quitarlo
config.configure();
trabajó para mi. Con la estructura src / java / ... HibernateUtil.java y el archivo cfg bajo src / resources.
Otra razón por la que se produce esta excepción es si llama al método de configuración dos veces en un objeto de Configuration
o Configuration
AnnotatedConfiguration
como este:
AnnotationConfiguration config = new AnnotationConfiguration();
config.addAnnotatedClass(MyClass.class);
//Use this if config files are in src folder
config.configure();
//Use this if config files are in a subfolder of src, such as "resources"
config.configure("/resources/hibernate.cfg.xml");
Por cierto, esta estructura de proyecto está dentro de eclipse.
Para cualquier persona interesada: si está utilizando Intellj , simplemente coloque hibernate.cfg.xml
debajo de src/main/resources
.
Puede colocar el archivo "hibernate.cfg.xml" en la carpeta src (src / hibernate.cfg.xml) y luego iniciar la configuración como el código a continuación:
Configuration configuration = new Configuration();
sessionFactory =configuration.configure().buildSessionFactory();
Usar el método configure () dos veces es responsable del problema para mí. En lugar de usar así:
Configuration configuration = new Configuration().configure();
configuration.configure("/main/resources/hibernate.cfg.xml");
Ahora, estoy usando así, el problema ya no existe.
Configuration configuration = new Configuration();
configuration.configure("/main/resources/hibernate.cfg.xml");
PS: Mi archivo hibernate.cfg.xml se encuentra en "src / main / resources / hibernate.cfg.xml", también. El código que más me gusta funciona para mí. en hibernate-5
public class HibernateUtil {
private static SessionFactory sessionFactory ;
static {
try{
Configuration configuration = new Configuration();
configuration.configure("/main/resources/hibernate.cfg.xml");
StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties());
sessionFactory = configuration.buildSessionFactory(builder.build());
}
catch(Exception e){
e.printStackTrace();
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}