2011-03-10 4 views
6

como una continuación de hibernate optional joinhibernación opcional se unen - necesidad de volver unirse valor de columna de cualquier manera

Muchas consultas existentes en el sistema dependen de la existencia de una relación de mapeado entre EntityOne y EntityTwo y cambiando esto no es una opción attactive Sin embargo, ahora necesito comenzar a almacenar y recuperar valores en tbl_one.two_id que no existen en la tabla unida. En el camino, esto funciona bien con la siguiente asignación:

@Entity 
@Table(name="tbl_one") 
public class EntityOne 
{ 
    .... 
    @ManyToOne 
    @NotFound(action = NotFoundAction.IGNORE) 
    @JoinColumn(name = "two_id") 
    private EntityTwo two; 
    .... 
} 

.. Sin embargo, cuando la consulta, si el resultado tiene un valor para two_id que no existe en la tabla combinada, el valor para el campo es two nulo y no tengo forma de decir cuál es realmente el valor de tbl_one.two_id. Esperaba que hibernate creara un objeto ficticio EntityTwo y rellenase su campo de id. Solo si la relación no existía.

También he intentado mapeo two_id a otro campo sin una combinación:

@Entity 
@Table(name="tbl_one") 
public class EntityOne 
{ 
    .... 
    @ManyToOne 
    @NotFound(action = NotFoundAction.IGNORE) 
    @JoinColumn(name = "two_id", insertable = false, updatable = false) 
    private EntityTwo two; 

    @Column(name = "two_id") 
    private String twoId; 
    .... 
} 

... pero entonces el campo two no está poblado, incluso cuando existe el registro correspondiente.

Esencialmente Necesito alguna manera de insertar/actualizar un valor para tbl_one.two_id y la recuperación de una entidad unido para EntityTwo si la relación existe, o si la relación no existe sólo el valor de tbl_one.two_id.

Espero poder resolver esto sin crear dos asignaciones para la misma tabla.

gracias.

EDIT: más información

public class EntityTwo 
{ 
    ... 
    @Id 
    @Column(name = "site_id") 
    private String id; 
    ... 
} 

Respuesta

4

Esto debería funcionar:

@ManyToOne 
@NotFound(action = NotFoundAction.IGNORE) 
@JoinColumn(name = "two_id", insertable = false, updatable = false) 
private EntityTwo two; 

@Formula("two_id") 
private String twoId; 

Hibernate seleccione la columna two_id dos veces: una vez para llenar las dos relaciones, y una vez para poblar el twoId. Sin embargo, la propiedad twoId es de solo lectura.

También se puede hacer a la inversa, pero entonces es la propiedad de dos que se convertirá en sólo lectura:

@ManyToOne 
@NotFound(action = NotFoundAction.IGNORE) 
@JoinFormula("two_id") 
private EntityTwo two; 

@Column("two_id") 
private String twoId; 
+0

con su JoinFormula por ejemplo, me estoy poniendo 'org.postgresql.util.PSQLException: ERROR: columna this_.two_two_id no existe' cuando se consulta ...? Supongo que el 'valor'" two_id "debería ser algo más, pero no puedo encontrar ejemplos en línea. ¿Puedes ayudarme? – pstanton

+0

realmente no hay documentación para JoinFormula :( – pstanton

+0

La documentación es muy clara. Pruebe con @JoinFormula (value = "two_id", referenciadoColumnName = "two_id") y mire el SQL generado para ver qué poner como valores de atributo. Además, consulte http://opensource.atlassian.com/projects/hibernate/browse/HHH-5041 y http://opensource.atlassian.com/projects/hibernate/browse/HHH-5171 para obtener índices sobre cómo podría funcionar –

Cuestiones relacionadas