Comment puis-je mettre à jour la classe de béton dans la stratégie de la hiérarchie de la table d'Hibernate?

StackOverflow https://stackoverflow.com/questions/8991956

Question

J'ai employé la hiérarchie de la table par classe Hibernate, comme indiqué sur ici .

J'ai une hiérarchie simple de 1 tiers où le parent comprend un certain nombre d'attributs et de l'enfant (Ren) incluent plus de la même chose.Il existe également des relations avec l'objet.Par exemple:

@Table(uniqueConstraints = { @UniqueConstraint(columnNames = {"name"}) })
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "type", discriminatorType = DiscriminatorType.STRING, length = 1)
abstract class X {
...
Long id;
String name;
List<A> a;
...
}
class Y extends X {
...
String getType() { return "Y"; }
...
}
class Z extends X {
...
String getType() { return "Z"; }
...
}
class A {}

Ce que je dois faire est de "mettre à jour" une instance persistante de y à une instance de z entretien de l'intégrité.Si j'imense supprimer y;Créez z, je reçois des violations de contraintes uniques (en raison de la commande de suppression de Hibernate de suivre les crédies / mises à jour) mais n'a trouvé aucune stratégie pour "mettre à jour" Y à z.

Était-ce utile?

La solution

afaik, il n'y a aucun moyen de le faire sans contourner complètement la session, car cela signifierait qu'un objet Java change son type de béton, ce qui est impossible.Et même alors, si une transaction simultanée met à jour la même entité en même temps, vous feriez mieux d'avoir une concurrence optimiste.Et si une autre transaction rafraîchit l'entité ou le chargement paresseux, et le type a changé, vous aurez des problèmes.

En bref, si vous avez besoin de le faire, cela signifie probablement que vous ne devriez pas avoir héritage en premier lieu.Envisagez de mapper le tableau sous forme d'entité unique, avec une colonne de type et des champs facultatifs.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top