2009-05-07 5 views
9

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.

Répondre

5

J'ai trouvé la raison AttributeOverride ne fonctionnait pas. Lorsque vous annotez la classe, vous devez inclure l'identifiant de l'objet incorporé dans le champ de nom. Je faisais ceci:

@Entity 
@AttributeOverride(name = "location", column = @Column(name = "location", insertable = false, updatable = false) 
class SubClass extends BaseClass { 

Quand il avait besoin d'être ceci:

@Entity 
@AttributeOverride(name = "data.location", column = @Column(name = "location", insertable = false, updatable = false) 
class SubClass extends BaseClass { 

Chose étrange est que le changement du champ de nom @ colonne a fait un travail avec la première version, mais insérables et champs actualisables ont été ignorés . Je ne sais pas si c'est un bug ou une subtilité de la spécification JPA.

Quoi qu'il en soit, cela résout comment rendre le champ en lecture seule mais il ne répond pas à la question d'origine: Est-il possible de créer un champ à partir d'un transitoire de superclasse mappée?

+0

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? –

+0

@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. –

Questions connexes