Esta pregunta es algo relacionado con Hibernate Anotación De La Colocación De La Pregunta.

Pero quiero saber cual es mejor? Acceso a través de propiedades o el acceso a través de los campos?
¿Cuáles son las ventajas y desventajas de cada uno?

25 Comentarios

  1. 31

    Prefiero descriptores de acceso, ya que puede añadir un poco de lógica de negocio a mi descriptores de acceso cada vez que lo necesito.
    He aquí un ejemplo:

    @Entity
    public class Person {
    
      @Column("nickName")
      public String getNickName(){
         if(this.name != null) return generateFunnyNick(this.name);
         else return "John Doe";
      }
    }

    Además, si usted lanza otro libs en la mezcla (como algunos JSON-conversión de la lib o BeanMapper o Cargadores o otros bean de asignación/clonación lib basado en getter/setter propiedades) tendrás la garantía de que la lib está en sincronía con el gestor de persistencia (ambos utilizan el getter/setter).

    • Nota esto es acerca de cómo el ORM tiene acceso a los campos y propiedades y no el código de la aplicación. Con acceso al campo de su getNickName() método funcionaría exactamente como era de esperar. No ocurre lo mismo si uso el persistente ‘propiedades’ fuera de getters/setters. Que es donde usted puede golpear problemas con el acceso a la propiedad y la carga diferida. Así que no, no estoy de acuerdo con este argumento, en general. Sin embargo, la última vez que revisé Hibernate tenía problemas con el acceso al campo de @Id de los campos.
    • esta respuesta no está relacionado con la pregunta. Mejor respuesta s por duffymo
    • no hay ninguna lógica de negocio dentro de los descriptores de acceso. que no es obvio comportamiento.
  2. 233

    Hay argumentos para ambos, pero la mayoría de ellos se derivan de ciertos requisitos de usuario «¿qué pasa si usted necesita para añadir lógica de», o «xxxx rompe la encapsulación». Sin embargo, nadie realmente ha comentado en la teoría, y dado correctamente una argumentación razonada.

    Lo que es Hibernate/JPA haciendo cuando persiste un objeto – bien, es conservar el ESTADO del objeto. Que significa el almacenamiento de una manera que puede ser fácilmente reproducido.

    ¿Cuál es la encapsulación? Encapsulados significa la encapsulación de los datos (o el estado), con una interfaz que la aplicación cliente puede utilizar para acceder a los datos de forma segura – mantener la coherencia y validez.

    Pensar en esto como MS Word. MS Word mantiene un modelo de documento en la memoria – los documentos del ESTADO. Presenta una interfaz que el usuario puede utilizar para modificar el documento – un conjunto de botones, herramientas, comandos de teclado, etc. Sin embargo, cuando elige a persistir (Guardar) que en el documento, se guarda el estado interno, no el conjunto de pulsaciones de teclas y clics del ratón utilizados para generarla.

    Guardar el estado interno del objeto NO se rompe la encapsulación – de lo contrario no entiendo muy bien lo de la encapsulación de los medios, y por qué existe. Es como el objeto de la seriación, la verdad.

    Por esta razón, EN la MAYORÍA de los CASOS, es apropiado para persistir los CAMPOS y no los descriptores de acceso. Esto significa que un objeto puede ser recreado con precisión a partir de la base de datos exactamente de la manera en que se almacenó. No debería necesitar ninguna validación, debido a que esto fue hecho en el original cuando fue creado, y antes de que se almacenan en la base de datos (a menos que, Dios no lo quiera, usted está almacenando datos no válidos en la DB!!!!). Del mismo modo, no será necesario para calcular los valores, como ya estaban calculados antes de que el objeto se almacena. El objeto debe mirada de la manera que lo hizo antes de que se guardó. De hecho, mediante la adición de más cosas en los getters/setters que son en realidad el aumento de el riesgo de crear algo que no es una copia exacta de la original.

    Por supuesto, esta funcionalidad fue añadida por una razón. Puede haber algunos válido casos de uso para la persistencia de los descriptores de acceso, sin embargo, por lo general va a ser raro. Un ejemplo puede ser que desee para evitar la persistencia de un valor calculado, aunque puede pedirle a la pregunta de por qué no calcular de la demanda en el valor del captador, o por pereza activa en el captador. Personalmente no puedo pensar en ninguna buena de casos de uso, y ninguna de las respuestas aquí realmente dar un «Ingeniería de Software» como respuesta.

    • La ingeniería de software respuesta es: el uso de los descriptores de acceso viola SECO.
    • (encapsulamiento)
    • Muy buena. Antes de leer este había estado dudando de cuál utilizar.
    • Tengo una pregunta de seguimiento, respecto al último párrafo de su respuesta. Usted escribió «Un ejemplo de esto puede ser que desee para evitar la persistencia de un valor calculado». ¿Cómo se puede evitar la persistencia de un valor calculado por tener la propiedad de acceso basado en? Yo sé que ustedes están discutiendo para no hacerlo pero no estoy recibiendo el punto aquí. Por favor puede explicar?
    • Ahora que leo de nuevo no estoy del todo seguro de mí mismo. Es de dos años desde que escribí esta respuesta. Creo que una mejor ejemplo podría ser el lugar donde usted está trabajando con un legado de la base de datos, y los datos se presentan de una manera diferente a su modelo de objetos – descriptores de acceso podría proporcionar una asignación entre los dos.
    • Un buen caso de uso para la asignación de descriptores de acceso es cuando usted necesita para agregar la información de asignación para las subclases de terceros clases de entidad que no están vinculadas a ninguna de persistencia de la aplicación. Ya que los campos son de carácter privado en las clases, usted tiene que reemplazar los descriptores de acceso y agregar la asignación de anotaciones para ellos. Otra opción sería el uso de XML de mapeo, pero algunas cosas son muy difíciles de hacer. Así que, si quieres anotaciones y mapa de terceros clases, subclases y añadir anotaciones en los descriptores de acceso es el camino a seguir.
    • hay que ir, un excelente ejemplo. Gracias.
    • Hacer de esta la respuesta a la pregunta, añadiendo el caso de uso a partir de los comentarios

  3. 77

    Prefiero acceso al campo, porque de esa manera no estoy obligado a dar getter/setter para cada propiedad.

    Una encuesta rápida a través de Google sugiere que el acceso al campo es que la mayoría (por ejemplo, http://java.dzone.com/tips/12-feb-jpa-20-why-accesstype).

    Creo que de acceso al campo es el lenguaje recomendado por la Primavera, pero no puedo encontrar una referencia a que una copia de seguridad.

    Hay un ASÍ, pregunta relativa que trató de medir el rendimiento y llegó a la conclusión de que no hay «ninguna diferencia».

    • si usted no proporcionar setter getter en la entidad, a continuación, cuál es el uso de ese campo…usted no puede utilizar anwyhere en la aplicación , porque los campos son privadas
    • No es la prestación de un getter y setter para sus campos mala práctica?, Supongo que mi comentario aquí no es siempre cierto, ya que estaba asumiendo un campo público, aunque obviamente podría ser un campo privado que nunca se accede.
    • Me siento realmente debería responder a sus preguntas, ya que es lo encapsulación es todo acerca de. Idealmente, todos los campos deben ser privado, y si es posible que no deben captadores o incubadoras – que es la mejor nivel de encapsulación puede esperar. Considere la posibilidad de una contraseña de corrector. 2 campos privados passwordHash y failedAttempts. Ambos pueden ser privados sin getter o setter. Son utilizados por bool checkPassword(string password) que hashes, cheques contra passwordHash y, a continuación, las actualizaciones de failedAttempts y devuelve un resultado. No hay necesidad de otro código para acceder nunca a estos dos campos.
    • cabe señalar que en la programación orientada a objetos, getters y setters un anti-patrón, que provienen de la programación procedimental, tener una clase con ellos se rompe el principio de encapsulación, y genera una gran cantidad de código repetitivo, es decir, el mismo tipo de código que se repite una y otra vez. Los objetos deben ser inmutables, si la modificación de sus propiedades es necesario se debe hacer a través de método que hacer algo más que simplemente devolver el valor de la propiedad.
    • No es así. «Anti-modelo» en este caso es una cuestión de opinión, no un dogma. Con eso dicho, acceso al campo es conveniente. Una mejor idea es alejarse de ORM soluciones en conjunto. Aprender a escribir SQL apropiado.
    • lo tengo ahora…después de 2 años que he ganado este con experiencia ….inmutable y mutable ambos tienen su lugar en la orientada a objetos en el mundo…incluso en la primavera de marco hemos pojos para conseguir el acceso de sus propiedades..que son necesarios…sin getters y setters…podemos tener problema…y si no se utiliza correctamente puede crear problemas…
    • lamentablemente, sólo porque un anti-patrón es utilizado por estos marcos, no significa que sea una buena cosa, y debe ser utilizado. A expensas de que nos libera de la preocupación de realizar las conexiones o de inyección de nosotros mismos, nos pueblan nuestro código con el código repetitivo y archivos de configuración. Es una situación de ganar-perder

  4. 37

    Aquí una situación donde usted TIENE que utilizar descriptores de acceso. Imagina que tienes un GENÉRICO clase abstracta con un montón de aplicación de la bondad a heredar en 8 de hormigón subclases:

    public abstract class Foo<T extends Bar> {
    
        T oneThing;
        T anotherThing;
    
        //getters and setters ommited for brevity
    
        //Lots and lots of implementation regarding oneThing and anotherThing here
     }

    Ahora exactamente cómo se debe anotar en esta clase? La respuesta es QUE NO se PUEDE anotar en cualquiera de los campos o de acceso a la propiedad porque no se puede especificar el destino de la entidad en este punto. Usted TIENE que anotar el implementaciones concretas. Pero desde que conservan las propiedades se declaran en esta superclase, usted DEBE utilizar acceso a la propiedad en las subclases.

    De acceso al campo no es una opción en una aplicación con un resumen genérico super-clases.

    • touche. Yo no había pensado en eso. Apuesto a Hibernar patadas algunos locos sql para estos.
    • Este problema de los sonidos mecánicamente difíciles de resolver sin anotar propiedades, pero nunca me he topado con un caso en el que necesitaba un resumen genérico de la clase con un montón de aplicación que también quería persistir. Normalmente puedo crear una jerarquía de clases para hacer mi objeto polimórfico (que lo que es genérico de ordenación de los descansos), y no únicamente para la reutilización de código. «Y un montón y un montón de aplicación» a menudo viola SRP de todos modos, en cuyo caso, probablemente voy a mover en clases separadas. Hay un ejemplo concreto que hacen de este caso de uso más obvio?
    • El único ejemplo concreto que tengo es que mi aplicación, que no puedo describir en un 500 carácter de comentario 😉
    • Usted puede utilizar abstract T getOneThing(), y abstract void setOneThing(T thing), y el uso de acceso al campo.
  5. 33

    Tiendo a preferir y el uso de descriptores de acceso:

    • Puedo agregar lógica si surge la necesidad (como se mencionó en la respuesta).
    • me permite llamar foo.getId() sin inicializar un proxy (importante cuando se usa Hibernate, hasta HHH-3718 resuelto).

    Inconveniente:

    • hace que el código sea más legible, tiene por ejemplo para navegar por toda la clase para ver si hay @Transient a su alrededor.
    • pero entonces, si usted utiliza un JPA proveedor que no tiene «proxies», entonces usted no tiene ese problema, alias «su JPA proveedor de imponer a usted».
  6. 13

    Que depende realmente de un caso específico, ambas opciones están disponibles por una razón. OMI se reduce a tres casos:

    1. setter tiene cierta lógica que no debe ser ejecutada en el momento de la carga de una instancia de una base de datos; por ejemplo, algunos de valor de validación que sucede en la incubadora, sin embargo, los datos procedentes de base de datos debe ser válida (de lo contrario sería no llegar (: ); en este caso el acceso al campo es el más apropiado;
    2. setter tiene cierta lógica que siempre debe ser invocada, incluso durante la carga de una instancia de bbdd; por ejemplo, la propiedad de ser inicializado se utiliza en el cálculo de algunas campo calculado (por ejemplo, la propiedad — un importe monetario, calculada de la propiedad — un total de varios monetaria propiedades de la misma instancia); en este caso del acceso a la propiedad es necesaria.
    3. Ninguno de los casos anteriores, entonces ambas opciones son aplicables, sólo permanecer constante (e.yo. si el acceso al campo es el de elección en esta situación, lo uso todo el tiempo en situación similar).
    • Soy nuevo en Hibernate y luchando con la misma pregunta. Creo que este post proporciona la más clara la respuesta. Gracias.
  7. 12

    Recomiendo acceso al campo y NO con las anotaciones en los getters (acceso a la propiedad) si quieres hacer algo más en las incubadoras que acaba de establecer el valor (por ejemplo, la Encriptación o de cálculo).

    El problema con el acceso a la propiedad es que las incubadoras son también llamado cuando el objeto está cargado. Esto me ha funcionado bien para muchos meses hasta que queríamos introducir el cifrado. En nuestro caso de uso que hemos querido cifrar un campo en la incubadora y descifrar en el captador.
    El problema ahora con el acceso a la propiedad fue que cuando Hibernate cargado el objeto también fue llamar a la incubadora para rellenar el campo y así fue cifrar el valor cifrado de nuevo.
    Este post también menciona esto:
    Java Hibernate: Diferentes conjunto de propiedades de la función de comportamiento dependiendo de quién está llamando

    Esto ha me causa dolores de cabeza hasta que me acordé de la diferencia entre el campo de acceso y de acceso a la propiedad. Ahora me he mudado a todos mis anotaciones de acceso a la propiedad de campo para el acceso y funciona bien ahora.

    • Sí – he encontrado que si se utiliza de acceso a la propiedad que usted realmente no puede hacer nada en su setter además de establecer el valor del campo.
    • +1 Mantener alejado de los getters/setters. Yo uso projectlombok.org y de mantener oculto de los desarrolladores.
  8. 8

    Prefiero usar el acceso al campo, por las siguientes razones:

    1. La acceso a la propiedad de puede llevar a errores desagradables cuando la aplicación de iguala/hashCode y hacer referencia a campos directamente (en contraposición a través de sus getters). Esto es porque el proxy sólo se inicializa cuando los captadores de acceso, y un directo de acceso al campo simplemente se devuelve null.

    2. La acceso a la propiedad de requiere que usted para anotar todos utilidad de los métodos de (por ejemplo, addChild/removeChild) como @Transient.

    3. Con acceso al campo podemos ocultar la @Version campo por no exponer a un getter en todo. Un getter también puede conducir a la adición de un setter así, y la version campo nunca se debe establecer manualmente (lo cual puede llevar a muy desagradables problemas). Todas las versiones incremento debe ser activado a través de OPTIMISTIC_FORCE_INCREMENT o PESSIMISTIC_FORCE_INCREMENT de bloqueo explícita.

    • 1. ¿Cómo el campo de la estrategia de acceso a prevenir esto? Este parece ser un general escollo con proxies, independientemente de que el acceso de estilo. 2. ¿Está seguro de que, en caso de ser sólo de la utilidad de los métodos getter? (pero un buen argumento de todos modos). 3. Exponer a los descriptores de acceso para version campo es a menudo útil en situaciones en las que se utilizan DTOs en lugar de desprendimiento de las entidades.
    • 1. Porque cuando un Proxy se inicializa. 2. 100% seguro. 3. Eso es un punto válido.
    • Perdón por mi ignorancia y la posible falta de interpretación de textos, (yo no soy un hablante nativo de inglés). Solo para aclarar, acceso al campo es cuando no hay métodos de captador/definidor son necesarios derecho, por lo que para un POJO, que es holístico utilizado, los campos son públicos? Pero decir algo en el primer tema y los enlaces de blog post dice lo contrario. Lo que me hizo comprender que se que no se puede usar es igual a cuando se utilizan servidores proxy y de acceso al campo.
    • No. Acceso al campo significa que Hibernate utiliza los campos a través de reflexiones para leer los atributos de entidad. Para obtener más detalles, consulte el Tipo de Acceso en la sección Hibernate Guía del Usuario.
  9. 7

    Creo que la anotación de la propiedad es mejor dado que la actualización de los campos directamente rompe la encapsulación, incluso cuando su ORM hace.

    Aquí es un gran ejemplo de donde se quemará usted: usted probablemente desea que sus anotaciones de hibernate validator & persistencia en el mismo lugar (cualquiera de los campos o propiedades). Si desea probar su hibernate validator powered validaciones que se anotan en un campo, no se puede utilizar un simulacro de su entidad para aislar la unidad de prueba que sólo el validador. Ouch.

    • Es por eso que usted ponga validador-anotaciones en los descriptores de acceso y persistencia de las anotaciones en los campos de
  10. 6

    Creo que de acceso a una propiedad frente de acceso al campo es ligeramente diferente con respecto a la inicialización perezosa.

    Considerar las siguientes asignaciones para 2 granos básicos:

    <hibernate-mapping package="org.nkl.model" default-access="field">
      <class name="FieldBean" table="FIELD_BEAN">
        <id name="id">
          <generator class="sequence" />
        </id>
        <property name="message" />
      </class>
    </hibernate-mapping>
    
    <hibernate-mapping package="org.nkl.model" default-access="property">
      <class name="PropBean" table="PROP_BEAN">
        <id name="id">
          <generator class="sequence" />
        </id>
        <property name="message" />
      </class>
    </hibernate-mapping>

    Y las siguientes pruebas de unidad:

    @Test
    public void testFieldBean() {
        Session session = sessionFactory.openSession();
        Transaction tx = session.beginTransaction();
        FieldBean fb = new FieldBean("field");
        Long id = (Long) session.save(fb);
        tx.commit();
        session.close();
    
        session = sessionFactory.openSession();
        tx = session.beginTransaction();
        fb = (FieldBean) session.load(FieldBean.class, id);
        System.out.println(fb.getId());
        tx.commit();
        session.close();
    }
    
    @Test
    public void testPropBean() {
        Session session = sessionFactory.openSession();
        Transaction tx = session.beginTransaction();
        PropBean pb = new PropBean("prop");
        Long id = (Long) session.save(pb);
        tx.commit();
        session.close();
    
        session = sessionFactory.openSession();
        tx = session.beginTransaction();
        pb = (PropBean) session.load(PropBean.class, id);
        System.out.println(pb.getId());
        tx.commit();
        session.close();
    }

    Podrás ver la sutil diferencia en la selecciona se requiere:

    Hibernate: 
        call next value for hibernate_sequence
    Hibernate: 
        insert 
        into
            FIELD_BEAN
            (message, id) 
        values
            (?, ?)
    Hibernate: 
        select
            fieldbean0_.id as id1_0_,
            fieldbean0_.message as message1_0_ 
        from
            FIELD_BEAN fieldbean0_ 
        where
            fieldbean0_.id=?
    0
    Hibernate: 
        call next value for hibernate_sequence
    Hibernate: 
        insert 
        into
            PROP_BEAN
            (message, id) 
        values
            (?, ?)
    1

    Que es, llamando fb.getId() requiere de un select, mientras que pb.getId() no.

    • Esto es divertido! 🙂 Pero es una implementación específica de comportamiento, de eso estoy seguro. Yo
    • Sí, supongo que esto es debido al hecho de que sólo las clases persistentes instrumentados. Es una pena, sin embargo debido a que el campo id es a menudo el de un campo que no tiene valor comercial y no necesita ningún descriptor de acceso.
  11. 2

    Otro punto a favor del acceso al campo es que de otra manera se ve obligado a exponer incubadoras para las colecciones así lo que, para mí, es una mala idea como cambiar el persistente de la colección de instancia de un objeto no gestionados por Hibernate romper definitivamente su consistencia de los datos.

    Así que prefiero tener colecciones como protegido de los campos inicializado para vaciar las implementaciones en el constructor por defecto y exponer sólo los getters. Entonces, sólo operaciones que se gestionan como clear(), remove(), removeAll() etc, son posibles que nunca Hibernate conscientes de los cambios.

    • Usted no está obligado a exponer nada como las incubadoras pueden ser protegidos. También los preparadores no son parte de la interfaz que está siendo implementado de modo que incluso si fueran públicos, que no son fácilmente accesibles.
  12. 2

    Prefiero campos, pero me he encontrado con una situación que parece me obligan a cabo las anotaciones en los captadores.

    Con la implementación de JPA Hibernate, @Embedded no parece trabajar en los campos. Así que tiene que ir en el captador. Y una vez que pongas en el captador, a continuación, los diversos @Column anotaciones tienes que ir en el captadores demasiado. (Creo que Hibernate no quiere mezclar los campos y getters aquí.) Y una vez que usted está poniendo @Column en los captadores en una clase, probablemente tiene sentido hacerlo todo.

  13. 2

    Estoy a favor del campo descriptores de acceso. El código es mucho más limpio. Todas las anotaciones se pueden colocar en uno
    sección de una clase y el código es mucho más fácil de leer.

    He encontrado otro problema con los descriptores de acceso: si usted tiene getXYZ métodos de su clase que NO están anotados como asociadas con propiedades persistentes, hibernate genera sql para intentar conseguir esas propiedades, lo que en algunos muy confuso mensajes de error. Dos horas desperdiciadas. No he escrito este código; yo siempre he utilizado campo de descriptores de acceso en el pasado y nunca se han topado con este problema.

    Hibernate versiones utilizadas en esta aplicación:

    <!-- hibernate -->
    <hibernate-core.version>3.3.2.GA</hibernate-core.version>
    <hibernate-annotations.version>3.4.0.GA</hibernate-annotations.version>
    <hibernate-commons-annotations.version>3.1.0.GA</hibernate-commons-annotations.version>
    <hibernate-entitymanager.version>3.4.0.GA</hibernate-entitymanager.version>
  14. 2

    Por defecto, JPA los proveedores de acceso de los valores de los campos de entidad y mapa de los campos a la base de datos de las columnas
    el uso de la entidad JavaBean descriptor de acceso de propiedad (captador) y mutador (setter) métodos. Como tal, la
    los nombres y tipos de los campos privados en una entidad no importa a JPA. En su lugar, JPA mira sólo
    los nombres y tipos de retorno de la JavaBean descriptores de acceso. Usted puede modificar este uso de la @javax.persistence.Access anotación, que permite especificar de forma explícita la metodología de acceso
    que la JPA proveedor debe emplear.

    @Entity
    @Access(AccessType.FIELD)
    public class SomeEntity implements Serializable
    {
    ...
    }

    Las opciones disponibles para el AccessType enum son de PROPIEDAD (el valor predeterminado) y el CAMPO. Con
    Los BIENES, el proveedor obtiene y establece los valores de campo utilizando el JavaBean métodos de propiedad. CAMPO hace
    el proveedor de obtener y establecer valores de campo utilizando los campos de instancia. Como mejor práctica, deberías sólo se adhieren
    el valor predeterminado y el uso de JavaBean propiedades a menos que tenga una razón de peso para no hacerlo.

    Usted
    puede poner estos bienes anotaciones en cualquiera de los campos privados o el descriptor de acceso público de los métodos. Si
    utilice AccessType.PROPERTY (por defecto) y anotar los campos privados en lugar de los JavaBean
    descriptores de acceso, los nombres de campo debe coincidir con el JavaBean nombres de propiedad. Sin embargo, los nombres no
    tiene que coincidir si se anota el JavaBean descriptores de acceso. Asimismo, si utiliza AccessType.FIELD y
    anotar el JavaBean descriptores de acceso en lugar de los campos, los nombres de campo también debe coincidir con el JavaBean
    los nombres de propiedad. En este caso, ellos no tienen que coincidir si usted anotar los campos. Lo mejor es simplemente
    ser coherente y hacer anotaciones en el JavaBean descriptores de acceso para AccessType.PROPERTY y los campos de
    AccessType.FIELD.

    Es importante que nunca se debe mezclar JPA propiedad anotaciones de JPA y anotaciones de campo
    en la misma entidad. Ello resulta en comportamientos no especificados y es muy
    probablemente a causa de los errores.

  15. 2

    Usted debe elegir el acceso a través de los campos de acceso a través de las propiedades.
    Con los campos que se pueden limitar los datos enviados y recibidos.
    A través de las propiedades que usted puede enviar más datos, como anfitrión, y
    conjunto G denominaciones (que se establece en la fábrica la mayoría de las propiedades en total).

  16. 1

    Hemos creado beans de entidad y utiliza captador de anotaciones. El problema que nos encontramos es esto: algunas entidades tienen reglas complejas para algunas propiedades cuanto al momento en que puede ser actualizado. La solución era tener algo de lógica de negocio en cada uno de los setter que determina si o no el valor real cambiado y, si es así, si el cambio se debe permitir. Por supuesto, Hibernate siempre se puede establecer las propiedades, así que terminamos con dos grupos de incubadoras. Bastante feo.

    La lectura de los posts anteriores, también veo que la referencia a las propiedades desde el interior de la entidad podría conducir a problemas con las colecciones no carga.

    Línea de fondo, me inclino hacia la anotación de los campos en el futuro.

  17. 1

    Permítanme tratar de resumir las razones más importantes para la elección de campo basado en el acceso. Si quieres profundizar más, por favor, lea este artículo en mi blog: Estrategias de acceso a JPA e Hibernate – Que es mejor, de campo o de acceso a la propiedad?

    De campo basado en el acceso es por mucho la mejor opción. Aquí hay 5 razones para ello:

    Razón 1: mejorar la legibilidad del código

    Si se utiliza el campo de acceso basado, usted anotar sus atributos de entidad con su asignación de anotaciones. Mediante la colocación de la definición de todos los atributos de entidad en la parte superior de su clase, se obtiene un relativamente compacto vista de todos los atributos y sus asignaciones.

    Razón 2: Omitir getter o setter métodos que no debe ser llamado por su aplicación

    Otra ventaja de campo basado en el acceso de su proveedor de persistencia, por ejemplo, de Hibernación o EclipseLink, no hace uso de los métodos getter y setter de sus atributos de entidad. Eso significa que usted no necesita proporcionar cualquier método que no debe ser utilizado por su código de negocios. Este es el caso más frecuente de métodos setter de generado atributos de clave primaria o versión columnas. Su proveedor de persistencia gestiona los valores de estos atributos, y no debe establecer mediante programación.

    Razón 3: aplicación Flexible de los métodos getter y setter

    Debido a que su proveedor de persistencia no llama a los métodos getter y setter, ellos no están obligados a cumplir con los requerimientos externos. Usted puede aplicar estos métodos en cualquier manera que usted desea. Que le permite implementar de negocios específicos de las reglas de validación, para activar más la lógica de negocio o para convertir a la entidad atributo en un tipo de datos diferente.

    Puede utilizar, por ejemplo, que a envoltura de un facultativo de la asociación o atributo en Java Opcional.

    Razón 4: No hay necesidad de marcar métodos de utilidad como @Transient

    Otro de los beneficios del campo de acceso basado en la estrategia es que usted no necesita anotar sus métodos de utilidad con @Transient. Esta anotación le dice a su proveedor de persistencia que un método o atributo no es parte de la entidad el estado persistente. Y porque en el campo tipo de acceso a la persistente estado obtiene definido por los atributos de su entidad, su implementación de JPA ignora todos los métodos de su entidad.

    Razón 5: Evitar errores al trabajar con proxies

    Hibernate utiliza proxies para perezosamente recuperan a uno de las asociaciones de para que pueda de control de la inicialización de estas asociaciones. Ese enfoque funciona bien en casi todas las situaciones. Pero introduce una peligrosa trampa si el uso de la propiedad basada en el acceso.

    Si el uso de la propiedad basada en el acceso, Hibernate inicializa los atributos del objeto proxy cuando se llama al método getter. Ese es siempre el caso si usted utiliza el objeto proxy en su código de negocios. Pero un buen montón de equals y hashCode implementaciones tener acceso a los atributos directamente. Si esta es la primera vez que acceda a cualquiera de los proxy, estos atributos son aún sin inicializar.

  18. 0

    Normalmente los frijoles son POJO, por lo que tienen los descriptores de acceso de todos modos.

    Así que la pregunta no es «cuál es el mejor?», pero, simplemente, «cuando el uso de acceso al campo?». Y la respuesta es «cuando usted no necesita un setter/getter para el campo!».

    • El problema es que no se puede mezclar de acceso al campo y de acceso a la propiedad en un POJO – tienes que elegir uno
    • De verdad? Debo haber olvidado. De todos modos, yo siempre uso un POJO d descriptores de acceso.
    • Tenga en cuenta que con JPA 2.0 (que no estaba cerca cuando esta pregunta se la hicieron) ahora usted puede mezclar los tipos de acceso, el uso de la @AccessType anotación.
  19. 0

    yo pensando acerca de esto y puedo elegir el método accesor

    ¿por qué?

    porque de campo y methos accesor es el mismo
    pero si más adelante necesito un poco de lógica en la carga de campo, puedo guardar mover todas las anotaciones se coloca en los campos de

    que respecta a

    Grubhart

  20. 0

    Para hacer sus clases más limpio, poner la anotación en el campo, a continuación, utilice @Access(AccessType.De la PROPIEDAD)

  21. 0

    AccessType.PROPIEDAD: El EJB persistencia de la implementación del estado de carga en su clase a través de JavaBean «setter» métodos, y recuperar el estado de su clase usando JavaBean «getter» métodos. Este es el valor predeterminado.

    AccessType.CAMPO: el Estado se carga y se recuperan directamente de la clase de los campos. Usted no tiene que escribir el JavaBean «getters» y «incubadoras».

Dejar respuesta

Please enter your comment!
Please enter your name here