[Java] Duda en persistencia Hibernate/EJB3

dagavi

Buenas, tengo una pequeña duda con los data mappers como los citados en el título, y por más que busco no encuentro ningún lado que de una respuesta directa.

En los ejemplos que veo siempre crean una primary key (y la anotan como ID) que es un valor numérico (ya sea short, integer, long).

¿Es posible en estos sistemas definir como @id un valor no numerico (por ejemplo un string)?

¿Y mapear una clave compuesta (por ejemplo {string, string, int})?

No necesito programar nada, es únicamente para un projecto en el que tenemos que especificar y no se si añadirle a cada clase (y tabla en la BD) una nueva clave numérica "id" o bien dejar las que ya tienen (que en algunos casos son strings o claves compuestas)


Edit: Al final he visto une jemplo que parece indicar que no es necesario que el ID sea numérico, además de ser compuesto.

En una clase Employee ponen:
@Id private String country;
@Id private int ID;

Aunque siguen usando un Id numérico también lo juntan con uno String, a sí que supongo que también se podrá dejar solo el String.

H4z4rD

La PK tendrá las restricciones de tipo que tenga la BD que utilices, así que en principio puede ser un string perfectamente.

Por otro lado, para claves compuesta, se suele crear un bean solo para la clave. En el bean de la pk se mapean cada uno de los atributos con sus columnas, pero no se marca como @Entity, si no como @Embeddable. Luego creas el POJO para la tabla completa y como ID pones un objeto de esta nueva clase, marcado como @EmbeddedId en vez de @Id

Por cierto, si es para temas de proyectos de universidad y tal, y tienes libertad a la hora de elegir tecnologías, te recomiendo EclipseLink, es otro OMR que implementa JPA como Hibernate, pero propio de eclipse. En eclipse ya tienes soporte para conectarlo directamente la BD, y te crea los pojos ya mapeados y con toda la configuración necesaria para usarlos directamente. Para el estudio y pequeñas aplicaciones esta muy bien.

Para cosas mas potentes, con MyEclipse y sus plugins para JPA/Hibernate puedes hacer hasta malabares. Previo paso por caja, claro esta ^^

1
dagavi

Gracias por la info, aunque ya no tengo tiempo de realizar cambios xD

La duda es para una asignatura de ingeniería de software. No necesitamos programar ni configurar nada, es todo especificación, pero claro, esta especificación debería ser coherente con la tecnología xD (si esta te obliga a crear ID numéricos para cada clase pues debería ponerlos, aunque ya veo que no).

Thx de nuevo!

JuAn4k4

Puedes crear @Id como String, de hecho Hibernate puede autogererarte claves String únicas con el uuid:

@Id @GeneratedValue(generator="system-uuid")
@GenericGenerator(name="system-uuid", strategy = "uuid")
public String getId() {
return id;
}

También te permite tener claves compuestas (para eso se usa en @EmbeddedId y el @Embeddable

El primero de ellos es para marcar la clave primaria:

@EmbeddedId
private MiClaseClavePrimaria primaryKey;

y luego:
@Embeddable
public class MiClaseClavePrimaria implements java.io.Serializable { ...

// atributos de la clave primaria (Incluso relaciones @ManyToOne (que suelen ser comunes cuando esta clase proviene de una relación (M:N) con atributos ).

}

Y openJPA, eclipseLink etc.. a mi no me ha gustado ninguno. Hibernate para mi sin duda es la elección.

Usuarios habituales

  • JuAn4k4
  • dagavi
  • H4z4rD