hibernate необязательное соединение - необходимо вернуть значение столбца соединения в любом случае - PullRequest
6 голосов
/ 10 марта 2011

как последующее из hibernate необязательное соединение

Многие существующие в системе запросы основаны на наличии сопоставленных отношений между EntityOne и EntityTwo, и изменение этого параметра не является уязвимым, однакоТеперь мне нужно начать хранить и извлекать значения в tbl_one.two_id, которых нет в объединенной таблице.По пути это прекрасно работает со следующим отображением:

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

.. Однако при запросе, если результат имеет значение для two_id, которого нет в объединенной таблице, значение дляполе two является нулевым, и я не могу сказать, каково значение для tbl_one.two_id на самом деле.Я надеялся, что hibernate создаст фиктивный объект EntityTwo и заполнит его поле id только в том случае, если связь не существует.

Я также попытался сопоставить two_id с другим полем без объединения:

@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;
    ....
}

... но тогда поле two никогда не заполняется, даже когда соответствующая запись существует.

По сути, мне нужен какой-то способ вставки / обновления значения для tbl_one.two_id и извлеченияобъединенная сущность для EntityTwo, если связь существует, или просто значение для tbl_one.two_id, если связь не существует.

Я надеюсь, что смогу решить эту проблему без создания двух сопоставлений для одного и того жеТаблица.

спасибо.

РЕДАКТИРОВАТЬ: больше информации

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

1 Ответ

4 голосов
/ 10 марта 2011

Это должно работать:

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

@Formula("two_id")
private String twoId;

Hibernate выберет столбец two_id дважды: один раз, чтобы заполнить два отношения, и один раз, чтобы заполнить twoId.Свойство twoId доступно только для чтения.

Вы также можете сделать обратное, но тогда это свойство два станет доступным только для чтения:

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

@Column("two_id")
private String twoId;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...