Je refactorise certaines classes de l'utilisation de SQL standard à JPA/ORM. Dans la plupart des cas, les objets ont une référence "réelle" mais parfois les références à d'autres objets ne sont données que par une référence d'identifiant de base de données non contrôlée (pas de clé étrangère, simplement une chaîne avec une référence à un autre ID de table).refactoring de référence JPA
Le code ressemble à:
@Entity
public final class myEntity implements Serializable {
@Id
@GeneratedValue(generator = "system-uuid")
@GenericGenerator(name = "system-uuid", strategy = "uuid")
@Column(name = "ID")
private String id;
@OneToOne
@JoinColumn(name = "OBJREF", nullable = false)
private otherObject objReference; /* Nice object reference */
@Column(name = "OTHEROBJREF")
private String otherObjReference; /* Damn db reference used by legacy code */
}
Comment dois-je faire face à la otherObjReference? L'attribut est utilisé par les systèmes hérités qui ont besoin de la construction getter/setter statique avec une chaîne! Si je reste avec l'ID, j'aurai des problèmes avec les requêtes JPA et je ne peux pas simplement assigner un objet et le conserver.
J'ai pensé à rendre le String transitoire et à travailler avec @PrePersist et @PreLoad pour charger une référence d'objet «réel» afin que je puisse travailler avec les deux. Mais dans ces méthodes, je n'ai pas accès à l'EntityManager (et la persistance ne devrait pas être la tâche de ce pojo dans ce cas ... ça sent mauvais design si je vais charger des références ici). Comme "otherObjReference" est privé, je peux également utiliser des getters et setters pour charger des données à partir de ma référence réelle. Mais les autres couches fonctionnent avec les objets, elles échouent donc lorsqu'elles appellent une méthode getOtherObjReference() car elles n'ont pas de connexion DB pour charger l'objet.
wow, je vais essayer! –
S'il vous plaît mettre à jour si cela a fonctionné sur non, c'est une discussion très intéressante –
@Jorn +1 vraiment intéressant –