J'ai un schéma hérité qui ne peut pas être modifié. J'utilise une classe de base pour les caractéristiques communes et il contient un objet incorporé. Il y a un champ qui est normalement mappé dans l'objet incorporé qui doit être dans l'ID de persistance pour une seule sous-classe (parmi de nombreuses). J'ai fait une nouvelle classe d'id qui l'inclut mais ensuite j'obtiens l'erreur que le champ est mappé deux fois. Voici quelques exemples de code qui est beaucoup plus simplifié pour maintenir la santé mentale du lecteur:Comment rendre un champ mappé hérité d'un transitoire de superclasse dans JPA?
@MappedSuperclass
class BaseClass {
@Embedded
private Data data;
}
@Entity
class SubClass extends BaseClass {
@EmbeddedId
private SubClassId id;
}
@Embeddable
class Data {
private int location;
private String name;
}
@Embeddable
class SubClassId {
private int thingy;
private int location;
}
J'ai essayé @AttributeOverride mais je ne peux l'obtenir pour renommer le champ. J'ai essayé de le mettre à updatable = false, insérable = false, mais cela ne semble pas fonctionner lorsqu'il est utilisé dans l'annotation @AttributeOverride.
Voir la réponse ci-dessous pour la solution à ce problème. Je réalise que je pourrais changer la classe de base mais je ne veux vraiment pas diviser l'objet incorporé pour séparer le champ partagé car cela compliquerait le code environnant et nécessiterait un code de retour laid. Je pourrais aussi reconcevoir le système entier pour ce cas de coin mais je préférerais vraiment pas. J'utilise Hibernate comme fournisseur JPA.
Je sais que cela a 6 ans maintenant, mais avez-vous déjà trouvé une solution à cette question? Et/ou se souvenir de ce que c'était? –
@EricB. Désolé, jamais trouvé un moyen de ne pas hériter d'un champ mappé. Je ne pense pas qu'il soit possible de le faire. Je pense qu'ils pourraient voir cela comme essayer de réduire la visibilité d'une méthode héritée en Java - donc juste contre les règles. Dans mon cas, j'ai travaillé au coin de la rue, ce qui est un peu moche mais était la seule option. –