Persistencia - Entidades - Herencia

Tengo el siguiente modelo de entidades donde cada entidad la deseo almacenar un una tabla por separado. La tabla maestra será la del padrón personas. Observen mi modelo y abajo describo mi problema.

@Entity
@Table(name = "padron_persona")
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Persona implements Serializable {

private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

@Column(name = "curp", nullable = false, updatable = false, unique = true)
@NotNull
private String curp;

public Long getId() {
return id;
}

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

public String getCurp() {
return curp;
}

public void setCurp(String curp) {
this.curp = curp;
}
}

@Entity
@Table(name = "padron_empleado")
public class Empleado extends Persona {

private String numeroEmpleado;

public String getNumeroEmpleado() {
return numeroEmpleado;
}

public void setNumeroEmpleado(String numeroEmpleado) {
this.numeroEmpleado = numeroEmpleado;
}

}

@Entity
@Table(name = "padron_clientes")
public class cliente extends Persona {

@Embedded
private DomicilioEmbedded domicilio;
@Embedded
private DatosContactoEmbedded datosContacto;

public DatosContactoEmbedded getDatosContacto() {
return datosContacto;
}

public void setDatosContacto(DatosContactoEmbedded datosContacto) {
this.datosContacto = datosContacto;
}

public DomicilioEmbedded getDomicilio() {
return domicilio;
}

public void setDomicilio(DomicilioEmbedded domicilio) {
this.domicilio = domicilio;
}

}

Si persisto una entidad Empleado con un curp X no hay problema, sin embargo cuando deseo almacenar como cliente a la persona con ese mismo CURP me da errores de violación de llave primaria y se bien que es por la anotación @Column(name = "curp", nullable = false, updatable = false, unique = true) sobre la propiedad curp. Y mi gran duda como es que puedo hacer que este modelo funcione, donde pretendo que los datos de las personas solo queden en una tabla y se hereden a las demás entidades. Se que puedo hacerlo bajo otro modelo, pero deseo usar herencia.

¿Alguién me puede apoyar?

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de beto.bateria

No escribiste el contexto de

No escribiste el contexto de tu problema, asi que la solucion puede variar mucho, sin embargo tratare de una manera general, contestarte:

¿Cual es el motivo por el cual quieres usar herencia? Si es solo para probar, o porque solo lo quieres hacer, creo que no es motivo para hacerlo. Un buen motivo para hacerlo es que la arquitectura quede en una condicion para que se le pueda dar mantenimiento facilmente, que las acciones que quieres que se ejecuten sean mas rapidas, tener un modelo en donde cada clase tenga tareas bien especificas, etc.

Sin mas voy a la respuesta:

Considera esto, si el empleado y el cliente tienen datos en comun y datos diferentes, puedes crear una clase que se llame persona(que tenga la informacion en comun), y asignarle una tabla que tenga todos los atributos de la clase. Tambien asignarle una tabla a empleado y otra a cliente, en donde se puedan guardar los atributos de cada objeto. La llave foranea podra ser el curp sin ningun problema.

En la clase persona puedes tener el status, si es cliente, empleado o ambos. De esta forma, si con el tiempo aumenta un tipo de persona (por ejemplo vendedor) no habra mucho problema para implementarlo.

El reto es si una persona es cliente y empleado, aunque lo puedes resolver con un patron, usando interfaces, o de otra manera. La verdad creo que es un buen reto resolver este problema.

Problema de unicidad en entidades maestras heredadas

Pense que al poner Persistencia - Entidades - Herencia el contexto del problema estaba claro, pero quizás debe agregar que tengo un problema con el manejo de la unicidad en una entidad -clase maestra-, en un modelo de entidades heredadas.

Y gracias por atender mi escrito. Y no se trata de probar, en mi experiencia generalmente he visto que se hacen una tabla para empleados y otra para clientes, y si un empleado se volviera cliente o viceversa, los datos se duplican. Buscando eliminar eso, planteo esto. Y en realidad busco una solución usando herencia para esto. He probado la persitencia de los entidades, la actualización y la recuperación de datos de forma exitosa, sin embargo, no encuentro algo que me ayude de forma simple o resolver este problema de unicidad.

Imagen de beto.bateria

Me refiero al contexto de los

Me refiero al contexto de los requerimientos del cliente, leyendo tu ultimo post creo que te va a servir lo que comente, aunque no es algo facil de llevar a cabo.