La cartographie des propriétés calculées avec JPA
Est-il un moyen de mapper une propriété calculée en utilisant JPA?
En supposant que j'ai un Invoice
objet avec un ou plusieurs InvoiceLineItems
sein, je veux avoir une persistance de la propriété calculée sur la Invoice
classe qui me donne le montant total:
class Invoice {
...
@Column(name = "TOTAL_AMOUNT")
public BigDecimal getTotalAmount() {
BigDecimal amount = BigDecimal.ZERO;
for (InvoiceLineItem lineItem : lineItems) {
amount = amount.add(lineItem.getTotalAmount());
}
return amount;
}
}
Maintenant, je pourrais créer un protégé non-op setTotalAmount
méthode pour faire JPA heureux, mais je me demandais si il existe un moyen de laisser JPA savoir que la cartographie est d'une seule façon et pour éviter de créer un superflu méthode d'initialisation.
Grâce,
Aleks
OriginalL'auteur Aleksandar Seovic | 2009-08-31
Vous devez vous connecter pour publier un commentaire.
Ce que vous avez décrit n'est pas une propriété calculée en JPA sens. Vous êtes le calcul vous-même dans votre méthode, juste marquer que la méthode que
@Transient
et JPA va l'ignorer.Si vous avez vraiment besoin d'une propriété calculée (où "calculé" signifie "calculé par l'expression SQL"), vous aurez besoin de les annoter selon votre fournisseur JPA. Pour Hibernate vous auriez du le faire via
@Formula
annotation:D'autres fournisseurs peuvent avoir leurs propres façons de configurer cela; il n'y a pas de standard JPA.
Votre exemple est assez étrange, puis. Si vous êtes à la stockage cette valeur et l'interrogation sur elle, pourquoi êtes-vous recalculer dans votre getter? Le bas de ligne, cependant, est que si vous êtes en annotant méthode de lecture (par opposition à la propriété), vous devez avoir un setter correspondant (il peut être privé) afin de JPA pour alimenter la valeur de votre entité.
L'exemple que j'ai donné est une grossière simplification du modèle de domaine, je travaille avec, qui ont plusieurs niveaux de un à plusieurs relations, avec la propriété calculée à chaque niveau qui dépend des enfants. Le calcul de la valeur en Java que nécessaire est beaucoup plus facile que d'essayer de mettre à jour la totalité des objets enfants dans une (profonde) de la hiérarchie sont ajoutées, supprimées ou modifiées, ce qui est pourquoi je suis d'un recalcul.
Toutefois, le fait de total a persisté fait des requêtes sur la base de la quantité contre la table qui stocke les objets racines beaucoup plus simple, qui est que je veux persister lorsque j'enregistre mes objets, mais ne veulent pas vraiment à la charge de jamais plus jamais (c'est pourquoi je n'ai pas besoin et je ne pouvais pas moins de soins sur le setter). C'est pourquoi j'espérais qu'il y est une façon de dire JPA pour traiter de la propriété en écriture seule à partir d'un point de vue de la persistance. En tout cas, merci pour votre réponse, je crois que je vais partir avec les poseurs qui ne servent à rien d'autres fins que de faire JPA heureux 🙁
OriginalL'auteur ChssPly76
Je sais que je suis nécro-ing ce fil, mais peut-être que ça pourrait aider quelqu'un.
Si vous voulez calculer la valeur de lire, le
@PostLoad
annotation peut-être ce que vous voulez:OriginalL'auteur LeChe
Peut-être le PrePersist annotation peut être utilisée pour cela.
Braaaains... je veux dire, pourquoi ne pas vous juste un privé
updateTotalAmount()
méthode, et l'appeler à partir de lagetTotalAmount()
acccessor, ainsi que@PrePersist
? N'est-ce pas un getter est-ce?OriginalL'auteur Jörn Horstmann