El uso de javafx.granos de propiedades en el modelo de clases

Es una práctica correcta para el uso de JavaFX frijoles propiedades en el modelo de clases?

Me pregunto si es una buena práctica utilizar las propiedades en el modelo de clases para ser capaz de unirse a ellos más fácil con los componentes de la vista. No estoy preocupado acerca de la disponibilidad de las bibliotecas en el futuro, porque mi programa se ejecutará en JRE8 o más tarde, pero la naturaleza del uso de la JavaFX bibliotecas en el modelo de clases me hacen escéptico y me preocupa que la actual y futuro incompabilities especialmente porque quiero usar el modo de Hibernación para persisten esos atributos.

Nota: yo uso puro de JavaFX medio ambiente y nunca voy a necesitar de Swing compatibilidad en mi aplicación.

InformationsquelleAutor Johnny | 2014-04-20

3 Kommentare

  1. 19

    Voy a ofrecer algo de una opinión disidente aquí.

    JavaFX Propiedades y JPA

    Como ya he comentado en jewelsea la respuesta, utilizando un JavaFX basada en la propiedad de frijol con JPA es posible siempre y cuando el uso de «acceso a la propiedad» en lugar de «acceso al campo». El blog he enlazado no entra en más detalles sobre esto, pero la idea básica es que cualquier anotaciones en el get...() métodos y no en los campos. Tan lejos como puedo ver, esto no impide el uso de cualquiera de sólo lectura JavaFX propiedad de los patrones en conjunción con JPA, pero en realidad nunca he sentido JPA jugó muy bien, con propiedades de solo lectura (es decir, los métodos get y no hay un método establecido) de todos modos.

    Serialización

    Contrario a mi comentario sobre jewelsea la respuesta, y con el beneficio de un par de semanas para trabajar con este (y de haber sido colocado en una posición donde yo estaba frente a replicar varias clases de entidad en una JavaFX lado del cliente usando JavaFX propiedades), creo que la falta de serialización de JavaFX propiedades pueden ser resueltos. La observación clave es que usted realmente sólo necesita para serializar los envueltos de estado de la propiedad (no, por ejemplo, los detectores). Usted puede hacer esto mediante la implementación de java.io.Externalizable. Externalizable es un sub-interfaz de Serializable que requiere que se rellene el readExternal(...) y writeExternal(...) métodos. Estos métodos pueden ser implementados para extraer solo el estado envuelto por la propiedad, en lugar de la propiedad en sí. Esto significa que si su entidad es serializado y, a continuación, deserializa, usted terminará para arriba con una nueva propiedad de la instancia, y cualquier oyentes no se conserva (es decir, los oyentes se convierten de hecho en transient), pero hasta donde yo puedo ver que esto sería lo que se quería en cualquier razonable de casos de uso.

    Experimenté con frijoles definido de esta manera y todo parece funcionar bien. Además, me encontré con un pequeño experimento en la transferencia entre el cliente y un servicio web restful, el uso de los Jackson mapper para convertir a y desde una representación en JSON. Desde el asignador sólo se basa en el uso de los métodos get y set, este funciona bien.

    Algunas advertencias

    Un par de puntos que se necesitan para ser observado. Como con cualquier Serialización, es importante tener un constructor sin argumentos. Y, por supuesto, todos los valores envueltos por la JavaFX propiedades de los mismos deben ser serializables – otra vez esta es la misma regla que para cualquier serializable bean.

    El punto sobre JavaFX propiedades de trabajo a través de efectos secundarios es bien tomado, y el cuidado debe ser ejercido cuando el movimiento de estas propiedades, que son, en cierta medida, diseñado con un modelo de subprocesamiento único en la mente) potencialmente multi-threaded servidor. Una buena regla del pulgar es probable que si se utiliza esta estrategia, los oyentes sólo debe ser registrado en el lado del cliente (y recuerde, los oyentes son transitorios con respecto a la transferencia de vuelta al servidor, ya sea por la serialización o por representación en JSON). Por supuesto, que sugiere que el uso de estas en el lado del servidor, a continuación, podría ser un mal diseño; se convierte en un trade-off entre la conveniencia de contar con una sola entidad que es «todas las cosas para toda la gente» (propiedades observables para JavaFX cliente, serializable para la persistencia y/o de acceso remoto, y con la persistencia de las asignaciones para JPA) frente a la exposición de la funcionalidad (por ejemplo, observabilidad) donde podría no ser totalmente adecuados (en el servidor).

    Por último, si usted hace uso de la JPA, aquellos que tengan tiempo de ejecución de la retención que implica (creo) que su JavaFX cliente tendrá la javax.la persistencia de la especificación en el classpath).

    He aquí un ejemplo de un «hombre para todas las estaciones» entidad:

    import java.io.Externalizable;
    import java.io.IOException;
    import java.io.ObjectInput;
    import java.io.ObjectOutput;
    import java.time.MonthDay;
    
    import javafx.beans.property.IntegerProperty;
    import javafx.beans.property.ObjectProperty;
    import javafx.beans.property.SimpleIntegerProperty;
    import javafx.beans.property.SimpleObjectProperty;
    import javafx.beans.property.SimpleStringProperty;
    import javafx.beans.property.StringProperty;
    
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    
    /**
     * Entity implementation class for Entity: Person
     *
     */
    @Entity
    
    public class Person implements Externalizable {
    
    
        private static final long serialVersionUID = 1L;
    
        public Person() {
    
        }
    
        public Person(String name, MonthDay birthday) {
            setName(name);
            setBirthday(birthday);
        }
    
        private final IntegerProperty id = new SimpleIntegerProperty(this, "id");
    
        @Id
        @GeneratedValue(strategy=GenerationType.AUTO)
        public int getId() {
            return id.get();
        }
    
        public void setId(int id) {
            this.id.set(id);
        }
    
        public IntegerProperty idProperty() {
            return id ;
        }
    
        private final StringProperty name = new SimpleStringProperty(this, "name");
    
        //redundant, but here to indicate that annotations must be on the property accessors:
        @Column(name="name")
        public final String getName() {
            return name.get();
        }
    
        public final void setName(String name) {
            this.name.set(name);
        }
    
        public StringProperty nameProperty() {
            return name ;
        }
    
        private final ObjectProperty<MonthDay> birthday = new SimpleObjectProperty<>();
    
        public final MonthDay getBirthday() {
            return birthday.get();
        }
    
        public final void setBirthday(MonthDay birthday) {
            this.birthday.set(birthday);
        }
    
        public ObjectProperty<MonthDay> birthdayProperty() {
            return birthday ;
        }
    
        @Override
        public void writeExternal(ObjectOutput out) throws IOException {
            out.writeInt(getId());
            out.writeObject(getName());
            out.writeObject(getBirthday());
        }
    
        @Override
        public void readExternal(ObjectInput in) throws IOException,
                ClassNotFoundException {
            setId(in.readInt());
            setName((String) in.readObject());
            setBirthday((MonthDay) in.readObject());
        }
    
    }
    • ¿Qué acerca de la asignación de JavaFX colecciones? Hibernate tiene formas de asignación de Listas/Conjuntos, pero AFAIK no mapa JavaFX colecciones. Hay un patrón para la aplicación de OneToMany/ManyToMany relaciones y el uso de FXCollections (ObservableList o lo que sea) para volver a ellos?
    • Sí, buen punto. Tuve temporalmente olvidado el lío que se PersistentCollections. Necesito pensar acerca de esto (y no tengo tiempo ahora). Definitivamente es posible, pero puede implicar la aplicación de UserCollectionType, que podría ponerse feo con bastante rapidez.
    • si usted nunca tome el tiempo para considerar este y llegar a algo, por favor hágamelo saber. Me voy a tomar una foto en la implementación de UserCollectionType ahora, de todos modos. Hibernate es ideal para el ahorro me cientos de líneas de texto repetitivo pero su relativa unfriendliness con javaFX propiedades/colecciones es duro a veces.
  2. 9

    JavaFX Propiedad De Diseño

    JavaFX propiedades están diseñados de tal manera que usted no necesita estar en ejecución un JavaFX programa para el uso de ellos. Las secciones de la Oracle con JavaFX y Propiedades de Unión Tutorial, demuestra que dicho uso (por ejemplo, un proyecto de Ley de clases para modelar las propiedades de un proyecto de ley). El ejemplo del tutorial, solo se ejecuta un estándar de Java programa con un main y no un Aplicación JavaFX. Así que usted puede de forma genérica el uso de propiedades y vinculantes sin necesidad de un requisito adicional en JavaFX en tiempo de ejecución. Esto significa que usted podría, por ejemplo, hacer uso de JavaFX y propiedades de los enlaces en el lado del servidor de la aplicación.

    «Correcta» Prácticas

    OK, así que usted puede hacerlo, pero es «correcto» de la práctica?

    No creo que muchas personas utilizan JavaFX propiedades en este camino. Una razón para esto es simplemente porque JavaFX propiedades son muy nuevas. Yo no creo que sea «malo» para el uso de JavaFX propiedades en los objetos del modelo.

    Advertencias

    JavaFX propiedades no apoyo la serialización de Java (con esto me refiero a que el apoyo directo a la Serializable de la interfaz). Numerosos servidor de lado las tecnologías Java podrían requerir modelo de serialización y que sería incapaz de serializar cualquier objeto que hicieron uso de la JavaFX propiedades.

    JavaFX propiedades no son en sí el contenedor de conocimiento y trabajo a través de los efectos secundarios (e.g el cambio de una propiedad puede desencadenar una actualización de otro valor del límite), por lo que ser conscientes de ello y asegurarse de que este tipo de procesamiento es un enfoque aceptable en su entorno. En particular, tenga cuidado de no generar no deseados de condiciones de carrera en un multi-threaded entorno de servidor (JavaFX aplicaciones cliente generalmente requieren menos cuidados con respecto a este como JavaFX en general se ejecuta principalmente como un único hilo de medio ambiente).

    JavaFX y Propiedades de Hibernate/JPA

    No creo que la mezcla de JavaFX propiedades en Hibernate (o JPA) clases de entidad es una buena idea. No he visto a nadie hacer eso. Hibernate sí misma no es consciente de JavaFX propiedades y, en general, está diseñado para trabajar en contra de Java primitivas, como Cadenas y enteros, así que no sé cómo se podría asignar automáticamente un JavaFX propiedad a un campo de base de datos.

    Es muy probable que necesite una instalación que define su clase de entidad de jerarquía y una jerarquía paralela para su JavaFX propiedad modelo basado en clases y, finalmente, un asignador de capa que se asignan entre los dos. Este tipo de arquitectura, la instalación es esencialmente un Modelo MVVM. El modelo (M) es su Hibernación clases de entidad, y el modelo de vista (VM) es su JavaFX propiedad basado en el modelo.

    • Gracias! Así que no hay duda! No debo utilizar JavaFX propiedades en el modelo y las clases de entidad! Incluso en una aplicación de cliente como la mía. Podría haber varios problemas enormes! Yo no había tomado atención que JavaFX propiedades no son serializables.
    • Para lo que vale, I han visto JavaFX propiedades que se usan en conjunción con JPA. Funciona muy bien, porque JPA respeta el estándar de JavaBean patrón (get/setXXX), que JFX propiedades de extender. No estoy convencido de que es particularmente útil en cualquier escenario real, aunque, debido a la serialización problema.
    • Me puedes dar un ejemplo simple de la MVVM modelo que sugieren ser implementado en un JavaFX – JPA aplicación? Cualquier tutorial o tutorial o ejemplo de código? Muchas gracias.
  3. 0

    para la persistencia jpa las colecciones de esta firma para el método getter..

    @OneToMany
    List<Person> getAll()
    {
    return observableList;
    }
    • Hola, gracias por eso. ¿Cómo la correlación de la cartografía parece. tengo problemas here tal vez usted podría ayudar?

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea