2011-01-17 14 views
8

Suponiendo que tengo esta clase:¿Puedo usar el patrón de diseño del constructor junto con Hibernate?

public class MyEntity { 
    private int id; 
    private String name; 
    private MyEntity(int id, String name) {this.id= id; this.name = name;} 
    public static class MyEntityBuilder { 
    private int id; 
    private String name; 
    private MyEntityBuilder setId(int id) {this.id = id;} 
    private MyEntityBuilder setName(String name) {this.name = name;} 
    private MyEntity build() {return new MyEntity(id,name);} 
    } 
    private int getId() {return id;} 
    private String getName() {return name;} 
} 

¿Puedo utilizar las anotaciones de hibernación para asignarlo a una mesa?

Respuesta

4

El constructor es un mecanismo externo para crear objetos. Es suficiente que proporciones un constructor por defecto a tu entidad, y a hibernate no le importaría cómo lo obtuviste. Entonces sí, es posible, como una entidad normal.

5

Sí y no. Puede usarlo si también proporciona setters.

Hibernate usa Java Beans para acceder a las propiedades, por lo que depende de los métodos getXXX() y setXXX() presentes. El punto principal del patrón del constructor (al menos según Joshua Bloch) es crear objetos inmutables sin setters. Esto no funcionará con Hibernate (o cualquier ORM), ya que usan los setters para inyectar los valores.

Pero si solo quiere usar su API de generador como una interfaz fluida para generar los objetos mientras deja intactos sus getters y setters, entonces no hay daño en eso (aparte de que es una duplicación de código).

BTW: los emisores de Fluent no son definidores de Java Beans válidos. El mecanismo Introspector no los entiende. Los Setters deben tener un tipo de retorno nulo.

+0

es eso así? Pensé que si eliges el acceso a la propiedad (colocas @Column en la propiedad, no en los métodos de acceso), ¿puedes hacerlo con setters in hibernate? o hazlos de praya privados ... ¿qué pasa con la clase interna de Builder del patrón? ¿Es eso un problema para Hibernate? – bert

+1

@bert cuidado con su redacción: lo que usted describe es acceso de campo, no acceso a la propiedad. En Java, una propiedad se define por sus métodos getter y/o setter, no por el campo subyacente. Podría funcionar al anotar campos, pero no si los campos están marcados como finales (lo que se consideraría una buena práctica para los objetos creados con un generador). No, la clase interna no es un problema, siempre que sea estática y no esté marcada como @Entity. –

+0

gracias. Y usted está por supuesto correcto. Quise decir acceso a la propiedad. Mi caso de uso es donde los campos mapeados son 'actualizable = falso' y quiero aplicar eso en la API. – bert

Cuestiones relacionadas