Foros del Web » Programación para mayores de 30 ;) » Java »

Hibernate + Herencia

Estas en el tema de Hibernate + Herencia en el foro de Java en Foros del Web. Hola gente soy relativamente nuevo en este tema y quisiera saber si es posible realizar lo siguiente, me gustaría poder realizar la herencia con hibertenate ...
  #1 (permalink)  
Antiguo 08/08/2011, 13:48
 
Fecha de Ingreso: marzo-2009
Mensajes: 76
Antigüedad: 15 años, 1 mes
Puntos: 1
Hibernate + Herencia

Hola gente soy relativamente nuevo en este tema y quisiera saber si es posible realizar lo siguiente, me gustaría poder realizar la herencia con hibertenate pero que solo genere una tabla por clase hija, es decir si tengo la clase (Padre) persona y de la clase persona extiende la clase (Hija) empleadoPermanente y la clase (Hija) empleadoContratado me gustaria que me creara dos tablas empleadoPermanente y empleadoContratado donde estas tablas tendrian los atributos de la clase persona mas los que extiende de la clase hija que corresponda, le dejo como lo he realizado pero no me ha funcionado... tambien he visto otras estrategias pero lo que quisiera realizar es lo que he comentado anteriormente.

Les dejo el codigo

CLASE PERSONA

Código:
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public class Persona {
	@Column(name = "Nombre")
	private String nombre;
	@Column(name = "Apelldio")
	private String apellido;
	@Column(name = "Direccion")
	private String direccion;
	@Column(name = "Telefono")
	private String telefono;
	@Column(name = "Celular")
	private String celular;
	@Column(name = "Email")
	private String email;
	
	public Persona() {
		super();
	}
	
	public String getNombre() {
		return nombre;
	}
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
	public String getApellido() {
		return apellido;
	}
	public void setApellido(String apellido) {
		this.apellido = apellido;
	}
	public String getDireccion() {
		return direccion;
	}
	public void setDireccion(String direccion) {
		this.direccion = direccion;
	}
	public String getTelefono() {
		return telefono;
	}
	public void setTelefono(String telefono) {
		this.telefono = telefono;
	}
	public String getCelular() {
		return celular;
	}
	public void setCelular(String celular) {
		this.celular = celular;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	
}
Código:
@Entity
@Table(name = "Empleado_Contratado")
public class EmpleadoContratado extends Persona{
	@GeneratedValue
	@Id
	@Column(name = "Id_EmpleadoC")
	private long idEmpleadoC;
	@Column(name ="Especialidad")
	private String especialidad;

	public EmpleadoContratado() {
		super();
	}

	public String getEspecialidad() {
		return especialidad;
	}

	public void setEspecialidad(String especialidad) {
		this.especialidad = especialidad;
	}

}
Bueno faltan metodos y propiedades en esta ultima clase pero es la idea, como esta ahi cuando guardo un empleadoContratado solo me crea la tabla y guardar las propiedades del empleadoContratado no de la persona es decir IdEmpleadoContratado y Especialidad

Cualquier ayuda sera muy bienvenida
  #2 (permalink)  
Antiguo 08/08/2011, 16:11
Avatar de Ronruby  
Fecha de Ingreso: julio-2008
Ubicación: 18°30'N, 69°59'W
Mensajes: 4.879
Antigüedad: 15 años, 9 meses
Puntos: 416
Respuesta: Hibernate + Herencia

El inconveniente radica en que tus variables son privadas (porque estas usando encapsulamiento, que esta muy bien).

Al ser privadas y tu tener la definicion de las columnas en la variable y no en el getter (no recuerdo como le dicen a esto), la clase EmpleadoContratado al ser mapeada, no puede ver los demas campos.

Solucion: Mueve la definicion de las columnas a los getters, que si son publicos.

Es decir, en vez de hacer:
@Column(name = "Email")
private String email;

Lo haces en el getter:
@Column(name = "Email")
public String getEmail() {
return email;
}
  #3 (permalink)  
Antiguo 09/08/2011, 14:41
 
Fecha de Ingreso: marzo-2009
Mensajes: 76
Antigüedad: 15 años, 1 mes
Puntos: 1
Respuesta: Hibernate + Herencia

Muchas gracias por tu rapida respuesta Ronruby, pero lamentablemente no me ha funcionado, tambien intente poniendo las propiedades en protected y poner ahi los @Column pero tampoco, ya no se que mas probar si tiene alguna otra idea sera muy bienvenida!!!

Muchas gracias y saludos.

NicoStone
  #4 (permalink)  
Antiguo 09/08/2011, 15:09
Avatar de Ronruby  
Fecha de Ingreso: julio-2008
Ubicación: 18°30'N, 69°59'W
Mensajes: 4.879
Antigüedad: 15 años, 9 meses
Puntos: 416
Respuesta: Hibernate + Herencia

Ponle @Entity a la clase Persona.

Hice un ejemplo rapido y me funciono sin problemas.
Si eso no resuelve tu inconveniente, muestra el codigo que tienes hasta ahora
  #5 (permalink)  
Antiguo 09/08/2011, 16:36
 
Fecha de Ingreso: marzo-2009
Mensajes: 76
Antigüedad: 15 años, 1 mes
Puntos: 1
Respuesta: Hibernate + Herencia

Ya lo había probado y al poner el @Entity me tira error, te muestro las partes mas significativas

Parte del mensaje
java.lang.IllegalStateException: Failed to load ApplicationContext

Caused by: org.hibernate.AnnotationException: No identifier specified for entity: persona.Persona

Muchas gracias por tu ayuda... estoy preparando la muestra de las clases y demas... mas tarde lo posteo.

Muchas gracias de nuevo y saludos!

NicoStone
  #6 (permalink)  
Antiguo 09/08/2011, 17:05
 
Fecha de Ingreso: marzo-2009
Mensajes: 76
Antigüedad: 15 años, 1 mes
Puntos: 1
Respuesta: Hibernate + Herencia

CLASE PERSONA

Código:
package persona;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;


@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public class Persona {
	
	protected String nombre;
	
	protected String apellido;
	
	protected String direccion;
	
	protected String telefono;
	
	protected String celular;
	
	protected String email;
	
	public Persona() {
		super();
	}
	
	@Column(name = "Nombre")
	public String getNombre() {
		return nombre;
	}
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
	@Column(name = "Apelldio")
	public String getApellido() {
		return apellido;
	}
	public void setApellido(String apellido) {
		this.apellido = apellido;
	}
	@Column(name = "Direccion")
	public String getDireccion() {
		return direccion;
	}
	public void setDireccion(String direccion) {
		this.direccion = direccion;
	}
	@Column(name = "Telefono")
	public String getTelefono() {
		return telefono;
	}
	public void setTelefono(String telefono) {
		this.telefono = telefono;
	}
	@Column(name = "Celular")
	public String getCelular() {
		return celular;
	}
	public void setCelular(String celular) {
		this.celular = celular;
	}
	@Column(name = "Email")
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	
}
CLASE EMPLEADO CONTRATADO
Código:
package empleado;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

import persona.Persona;




@Entity
@Table(name = "EmpleadosContratados")
public class EmpleadoContratado extends Persona{

	@GeneratedValue
	@Id
	@Column(name = "Id_Empleado")
	private long idEmpleado;
	@Column(name ="Especialidad")
	private String especialidad;

	public EmpleadoContatado () {
		super();
	}

	public String getEspecialidad() {
		return especialidad;
	}

	
public void setEspecialidad(String especialidad) {
		this.especialidad = especialidad;
	}


	public long getIdEmpleado() {
		return idEmpleado;
	}

	public void setIdEmpleado (long idEmpleado) {
		this.idEmpleado = idEmpleado;
	}
}
El Archivo test-applicationContext.xml (Igual No creo que este archivo sea el problema ya que al sacar el @Entity no tirar error, no funciona como yo quisiera pero no tira error)

Código:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="  
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsd  
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd  
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd  
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

	<context:component-scan base-package="persona" annotation-config="true"/>
	<context:component-scan base-package="empleado" annotation-config="true"/>
	
	<context:component-scan base-package="testServicios" annotation-config="true"/>	

<!-- **************** CONFIGURACION DE HIBERNATE ************** -->

	<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource"
		destroy-method="close">
		<property name="driverClassName" value="com.mysql.jdbc.Driver" />
		<property name="url" value="jdbc:mysql://localhost:3306/NombreBD " />
		<property name="username" value="root" />
		<property name="password" value="claveRoot" /> 
	</bean>

	<bean id="sessionFactory"
		class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
		<property name="dataSource" ref="myDataSource"/>
		<property name="annotatedClasses">
			<list>
 				<value>persona.Persona</value>
				<value>empleado.EmpleadoContratado </value>
			</list>

		</property>
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
				<prop key="hibernate.show_sql">true</prop>
				<prop key="hibernate.hbm2ddl.auto">create</prop> 
			</props>
		</property>
	</bean>

	<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate"
		abstract="false" lazy-init="default" autowire="default"
		dependency-check="default">
		<property name="sessionFactory">
			<ref bean="sessionFactory"></ref>
		</property>
	</bean>

	<bean id="txManager"
		class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory" />
	</bean>

	<tx:advice id="txAdvice" transaction-manager="txManager">
		<!-- the transactional semantics... -->
		<tx:attributes>
			<!-- all methods starting with 'get' are read-only -->
			<tx:method name="get*" read-only="true" />
			<!-- other methods use the default transaction settings (see below) -->
			<tx:method name="*" />
		</tx:attributes>
	</tx:advice>
</beans>
Espero que el codigo ayude, gracias otra vez y saludos.

NicoStone
  #7 (permalink)  
Antiguo 23/08/2011, 15:00
 
Fecha de Ingreso: marzo-2009
Mensajes: 76
Antigüedad: 15 años, 1 mes
Puntos: 1
Respuesta: Hibernate + Herencia

Nadie sabe porque? Ya me he cansado de probar y no logro solucionarlo?

Cualquier info es bienvenida.

Saludos.

NicoStone
  #8 (permalink)  
Antiguo 23/08/2011, 16:04
Avatar de Ronruby  
Fecha de Ingreso: julio-2008
Ubicación: 18°30'N, 69°59'W
Mensajes: 4.879
Antigüedad: 15 años, 9 meses
Puntos: 416
Respuesta: Hibernate + Herencia

Para serte sincero no se porque no te funciona. Hice un ejemplito sencillo y me creo las tablas sin problemas con todos los campos de la clase padre + los campos especificos de cada hijo.
  #9 (permalink)  
Antiguo 23/08/2011, 16:41
Avatar de Ronruby  
Fecha de Ingreso: julio-2008
Ubicación: 18°30'N, 69°59'W
Mensajes: 4.879
Antigüedad: 15 años, 9 meses
Puntos: 416
Respuesta: Hibernate + Herencia

Para serte sincero no se porque no te funciona. Hice un ejemplito sencillo y me creo las tablas sin problemas con todos los campos de la clase padre + los campos especificos de cada hijo.

Trata de ir al foro oficial de la comunidad de Hibernate o a Coderanch donde te pueden ayudar mas rápido y hay mucha mas gente conocedora del tema.

MENSAJE DUPLICADO
  #10 (permalink)  
Antiguo 25/08/2011, 13:11
 
Fecha de Ingreso: marzo-2009
Mensajes: 76
Antigüedad: 15 años, 1 mes
Puntos: 1
Respuesta: Hibernate + Herencia

Muchas gracias de nuevo Ronruby!! Seguiré buscando si encuentro pongo la solución.

Abrazo.

NicoStone

Etiquetas: herencia, hibernate
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:31.