gracias por el aporte Julian, siento que merecías mas nota que un 7.. cuando estaba haciendo la resolución de tu parcial hice cosas casi identicas que vos, lo que si, terribles chupapijas cuando te marcaron en rojo lo de ´TABLE_PER_CLASS´
siento que te cagaron ahí.. porque es cualquiera, el punto 1 dice explicitamente que un cliente cuando solicita un servicio, solicita por el
tipo lo que hace de cajon que la estrategia del mapeo de herencia sea una TABLE_PER_CLASS, no puedo creer que se te quejaron porque en el punto 2 hacen un query solicitando el servicio polimorficamente, no tiene nada que ver con el punto 1 .. aparte vos le justificaste que funcionaba mal por eso y que se podía cambiar por JOINED.
era para irse a las piñas amigo, pero bueno.. felicitaciones de todas formas
pd: dejo la parte mas importante tal vez para que sea vea mejor, que es todo lo que es persistir las clases y etc.. (es pseudocodigo)
elementos del modelo a persistir:/*
la class SeleccionadorDeProfesionales no la persisto puesto que se seleccionan profesionales en el
momento en base a criterios, y no tiene sentido persistirlos en la base de datos.. el resto, todas
se persisten.
*/
cambios al modelo de objetos:/*
ninguno
*/
estrategia de mapeo de herencia:/*
opto por utilizar TABLE_PER_CLASS, puesto que el enunciado dice "un cliente solicita un servicio,
especifcando su tipo[..]" lo cual da a entender, que nunca se va a solicitar un servicio polimorficamente
entonces, gano mucha performance en las consultas no-polimorficas.. lo cual parece ser un factor dominante
a la hora de elegir un mapeo de herencias conveniente, eso si.. en caso de haber consultas polimorficas
perderia en temas de velocidad.
*/
@MappedSuperclass
class PersistentEntity{
@Id @GeneratedValue
private Long id
}
@Entity
@Table(name = "servicio")
@Inheritance(strategy = TABLE_PER_CLASS)
abstact class Servicio{
@Id
@GeneratedValue(strategy= GenerationType.TABLE)
@GenericGenerator(name = "uuid2", strategy = "uuid2")
private long ID;
@Embedded // gano performance embediendo esta clase al servicio, puesto que es un atributo
@OneToOne // que siempre esta presente, ademas, me ahorro un query extra
Ubicacion ubicacion;
@OneToMany
Set<Presupuesto> presupuestos;
@Column(ColumnDefinition = "DATETIME")
Date fechaDeRealizacion;
@Column(ColumnDefinition = "VARCHAR(30)")
String descripcion;
@Enumerated("string") // se mapea como string porque me interesa el contenido y no el numero
Tipo tipo;
}
class ServicioHogareño extends Servicio{
@Column(ColumnDefinition = "VARCHAR(30)")
String dni
@Column(ColumnDefinition = "VARCHAR(30)")
String nombreSolicitante
}
class ServicioEmpresarial extends Servicio{
@Column(ColumnDefinition = "VARCHAR(30)")
String CUIT;
@Column(ColumnDefinition = "VARCHAR(30)")
String razonSocial;
}
class Presupuesto extends PersistentEntity{
@ManyToOne
Profesional profesional;
@Column(ColumnDefinition = "BIGDECIMAL")
Float monto;
@Column(ColumnDefinition = "BIGDECIMAL")
Float tiempoEnHoras;
@Column(ColumnDefinition = "BOOLEAN")
Boolean estaAprobado;
}
class Profesional extends PersistentEntity{
@Embedded //embebo la ubicacion para el Profesional puesto que el mismo tambien
Ubicacion ubicacionActual; // siempre tiene presente una ubicacion, ganamos performance.. 1 query extra menos.
@ManyToMany
Set<PoliticaDeCuota> politicasDeCuota;
@ManyToMany
Set<Certificacion> certificaciones;
@Column(ColumnDefinition = "VARCHAR(30)")
String nombre;
@Column(ColumnDefinition = "VARCHAR(30)")
String apellido;
}
class Certificacion extends PersistentEntity{
@Enumerated
Tipo tipo;
@Column(ColumnDefinition = "DATETIME")
Date fecha;
@Column(ColumnDefinition = "BIGDECIMAL")
Float puntajeObtenido;
@Column(ColumnDefinition = "VARCHAR(30)")
String descripcion;
}
class Ubicacion{ // no hace falta IDS ni nada por el estilo, porque esta embebida
@Column(ColumnDefinition = "BIGDECIMAL")
Float latitud;
@Column(ColumnDefinition = "BIGDECIMAL")
Float longitud;
}
Enum Tipo{
ELECTRICIDAD, PLOMERIA, PISOS,..
}
[/code]