À l'aide de javafx.haricots propriétés dans les classes du modèle
Est-il une bonne pratique à utiliser JavaFX haricots propriétés dans les classes du modèle?
Je me demande si c'est une bonne pratique d'utiliser les propriétés dans des classes de modèle pour être en mesure de les lier plus facile avec le point de vue des composants. Je ne suis pas inquiet au sujet de la disponibilité de ces bibliothèques à l'avenir parce que mon programme sera exécuté sur JRE8 ou plus tard, mais la nature de l'utilisation de la JavaFX bibliothèques dans les classes du modèle de me faire sceptique et je suis inquiet sur la situation actuelle et future incompabilities spécialement parce que je veux utiliser Hibernate pour persister ces attributs.
Remarque: j'utilise un pur JavaFX environnement et j'ai n'auront jamais besoin de Swing de compatibilité dans mon application.
Vous devez vous connecter pour publier un commentaire.
Je vais vous offrir quelque chose d'une opinion dissidente ici.
JavaFX Propriétés et JPA
Comme je l'ai commenté sur jewelsea réponse, à l'aide d'un JavaFX propriété à base de haricot avec JPA est possible aussi longtemps que vous utilisez "l'accès à la propriété", plutôt que "sur le terrain". Le post de blog j'ai fait un lien il n'y va plus dans le détail sur ce point, mais l'idée de base est que toutes les annotations doivent être sur le
get...()
méthodes et non pas sur les champs. Aussi loin que je peux voir, ceci n'empêche l'utilisation de tout la lecture seule JavaFX propriété des modèles en collaboration avec JPA, mais je n'ai jamais vraiment senti JPA bien joué avec des propriétés en lecture seulement (c'est à dire des méthodes get et pas de la méthode de jeu) de toute façon.Sérialisation
Contrairement à mon commentaire sur jewelsea réponse, et avec le bénéfice de quelques semaines pour travailler avec cela (et d'avoir été placé dans une position où j'étais face à la réplication de plusieurs classes d'entité sur un JavaFX côté client à l'aide de JavaFX propriétés), je pense que le manque de sérialisation de JavaFX propriétés peuvent être contournées. L'observation essentielle est que vous avez vraiment besoin de sérialiser le enveloppés de l'état de la propriété (et non, par exemple, tous les auditeurs). Vous pouvez le faire par la mise en œuvre de
java.io.Externalizable
.Externalizable
est une sous-interface deSerializable
qui vous oblige à remplir lereadExternal(...)
etwriteExternal(...)
méthodes. Ces méthodes peuvent être mises en œuvre à l'externalisation de l'état enveloppé par la propriété, plutôt que le bien lui-même. Cela signifie que si votre entité est sérialisé et puis désérialisé, vous allez vous retrouver avec une nouvelle propriété de l'instance, et les auditeurs ne seront pas conservées (c'est à dire les auditeurs de devenir effectivementtransient
), mais aussi loin que je peux voir, ce serait ce qu'on voulait dans la mesure du raisonnable cas d'utilisation.J'ai expérimenté avec des haricots défini de cette façon et tout semble fonctionner à merveille. En outre, j'ai couru une petite expérience dans le transfert entre le client et un service web restful, à l'aide de l'Jackson mappeur pour convertir une représentation JSON. Depuis le mappeur juste s'appuie sur l'utilisation des méthodes get et set, cela fonctionne bien.
Quelques mises en garde
Un couple de points doivent être observés. Comme avec toute la Sérialisation, il est important d'avoir un constructeur sans argument. Et bien sûr, toutes les valeurs enveloppé par le JavaFX propriétés doivent eux-mêmes être sérialisable - encore une fois c'est la même règle que pour tout serializable bean.
Le point sur JavaFX propriétés de travail via des effets secondaires est bien pris, et de soins doit être exercée lors du déplacement de ces propriétés (qui sont, dans une certaine mesure, conçu avec un seul modèle de thread dans l'esprit) à une potentiellement multi-thread serveur. Une bonne règle de base est que si vous utilisez cette stratégie, les auditeurs devraient être inscrits sur le côté client (et rappelez-vous, ces auditeurs sont transitoires concernant le transfert vers le serveur, que ce soit par la sérialisation ou par représentation JSON). Bien sûr, cela suggère que l'utilisation de ces sur le côté serveur peut être une mauvaise conception; il devient un compromis entre le confort d'avoir une entité unique qui est "tout à tous" (propriétés observables pour l'JavaFX client, serializable de persistance et/ou d'accès à distance, et avec la persistance des mappages de JPA) par rapport exposant les fonctionnalités (par exemple, l'observabilité) où il pourrait ne pas être totalement approprié (sur le serveur).
Enfin, si vous ne l'utilisez les annotations JPA, ceux-ci ont d'exécution de rétention qui implique (je pense) que votre JavaFX client aura besoin de l'un javax.la persistance de la spécification dans le classpath).
Voici un exemple d'un tel "homme pour toutes les saisons" entité:
PersistentCollection
s. J'ai besoin de réfléchir sur ce sujet (et n'ont pas le temps en ce moment). Il est certainement possible, mais peut impliquer la mise en œuvre deUserCollectionType
, qui pourrait devenir laid assez rapidement.JavaFX Propriété De Conception
JavaFX propriétés sont conçus de telle sorte que vous n'avez pas besoin d'être en cours d'exécution d'un JavaFX programme à utiliser. Les sections de la Oracle à l'Aide de JavaFX et Propriétés de Liaison de Tutoriel, montre une telle utilisation (par exemple, un projet de Loi classe pour modéliser les propriétés d'un projet de loi). L'exemple du tutoriel fonctionne juste un norme programme Java avec un
main
et pas un Application JavaFX.. De sorte que vous pouvez génériquement utiliser les propriétés et la liaison sans avoir une exigence supplémentaire sur JavaFX. Cela signifie que vous pourriez par exemple utiliser JavaFX propriétés et les liaisons dans un serveur d'application côté."Corriger" Les Pratiques
OK, donc tu peux le faire, mais est-il de la "bonne pratique"?
Je ne pense pas que beaucoup de gens utilisent JavaFX propriétés de cette façon. Une des raisons est tout simplement parce que JavaFX propriétés sont tout à fait nouveaux. Je ne pense pas que c'est "mal" pour utiliser JavaFX propriétés des objets de modèle.
Mises en garde
JavaFX propriétés ne prennent pas en charge la sérialisation Java (j'entends par là le soutien direct de la Serializable interface). De nombreuses technologies Java côté serveur peut nécessiter modèle de sérialisation et ils seraient incapables de sérialiser un objet qui fait usage de JavaFX propriétés.
JavaFX les propriétés elles-mêmes ne sont pas conteneur de conscience et de travail par le biais d'effets secondaires (e.g la modification d'une propriété peut déclencher une mise à jour à l'autre lié à la valeur), donc être conscient de cela et s'assurer que ce type de traitement est une approche acceptable dans votre environnement. En particulier, attention à ne pas générer indésirable des conditions de course dans un environnement multi-thread environnement de serveur (JavaFX applications clientes généralement besoin de moins de soins à l'égard de ce que JavaFX en général fonctionne principalement comme un seul thread de l'environnement).
JavaFX Propriétés et Hibernate/JPA,
Je ne pense pas que le mélange JavaFX propriétés en veille prolongée (ou JPA) les classes d'entité est une bonne idée. Je n'ai pas vu quelqu'un le faire. Hibernate lui-même n'est pas conscient de JavaFX propriétés et, en général, est conçu pour fonctionner à l'encontre de Java primitives comme les Chaînes et les services de renseignements, je ne sais donc pas comment il pourrait éventuellement automatiquement la carte d'un JavaFX propriété à un champ de base de données.
Vous aurait probablement besoin d'une configuration qui définit votre entité hiérarchie de classe et une hiérarchie parallèle pour votre JavaFX propriété en fonction des classes de modèle et enfin un mappeur couche correspondance entre les deux. Ce type d'architecture de l'installation est essentiellement un Modèle MVVM. Le modèle (M) est votre Hibernate classes d'entité, et le modèle de vue (VM) est votre JavaFX propriété en fonction du modèle.
pour la persistance jpa collections il suffit d'utiliser cette signature pour méthode de lecture..