2012-03-22 22 views
5

Cuando tiene una entidad, como UserEntity, ¿quién es la propiedad id se deriva de su clave principal en el db? ¿Debería proporcionar un método setter como setId()?ID de la entidad como argumento constructor o mediante un método setter?

Algunos argumentos en contra:

  • abre la puerta a posibles sobrescribe accidentales de otras UserEntities en el PP
  • dos (o más) podrían existir UserEntities en cualquier momento con los mismos id pero diferentes propiedades . (Si me sacó 3 usuarios diferentes de la db y establecer sus valores id a la misma)

Algunos argumentos para:

  • si no tiene que crear una instancia del UserEntity con un id en el constructor (dado que tiene un método setter), puedo usar los métodos del objeto UserEntity con valores de usuario temporales/falsos/nuevos ... sin tener que insistir primero.

Proporcionar un regulador (y no fuerzan una id en el constructor), o forzar una id en el constructor, y retire la incubadora?

Respuesta

3

El valor de identidad de una entidad debe ser gestionado por la capa de persistencia e idealmente no podría ser configurable por otra cosa: la capa de persistencia debe asignar un nuevo valor de identidad a la persistencia y establecerlo en la recuperación. Además, debería poder usar una entidad transitoria (no persistente) sin necesidad de acceder a su identidad. Permitir que la identidad se establezca a través del constructor puede generar problemas porque no existe una fuente autorizada para los valores de identidad. Un ejemplo en el que se pueden asignar identidades de fuentes externas es si un cliente solicita que una entidad de nueva persistencia tenga un UUID como su identidad, aunque este ejemplo es artificial.

+0

¡Gracias por la respuesta! Cuando la capa de persistencia establece la identidad, ¿debería ser a través del constructor o mediante un setter? ¿Puede la entidad ser instanciada sin la identidad? – johnnietheblack

+1

Debe ser a través de un colocador o mediante reflexión, dependiendo del idioma. Y debería ser posible crear instancias sin una identidad, aunque uno debe ser consciente de que cuando una entidad transitoria se vuelve persistente, sus características de igualdad pueden cambiar mientras el objeto permanece en la memoria si, por ejemplo, el código hash se deriva de la identidad. – eulerfx

1

@johnnietheblack, prefiero crear un colocador privada y un captador pública a los identificadores de las entidades. Las validaciones estarán allí en el setter (si es necesario) y establezco esta identificación exclusivamente en constructores. Los identificadores numéricos se crean instancias con valores cero que me ayudan a seguir su ciclo de vida.

Dominio de diseño por Eric Evans hablar sobre los dominios del modelo cuando los patrones de la arquitectura de la aplicación empresarial por Martin Fowler en la profundidad de la infraestructura de estas aplicaciones. Creo que son complementarios y los recomiendo.

+0

Gracias! Estoy preocupado de que la semántica me esté reteniendo aquí, porque uso PHP, y no estoy seguro de qué podría lograr un setter privado. En PHP, ¿eso significaría un método privado de setId() y la entidad puede usar ese método en sí misma, pero ninguna otra entidad podría hacerlo? – johnnietheblack

+0

Encuentro que muchas veces tratar de ser independiente del idioma es más difícil que solo preguntar sobre un idioma específico ... jaja – johnnietheblack

Cuestiones relacionadas