EJB 3 Сущности с несколькими столбцами - одна и та же ссылка на объект - PullRequest
0 голосов
/ 25 августа 2011

У меня есть объект A, который имеет 3 атрибута, имеющих ссылку на другой объект B. Из реляционного POV это нормально, потому что у меня могут быть 3 разных идентификатора из таблицы B, которые хранятся в виде разных столбцов в таблице A. Для дополнительного пояснения в моей таблице A есть 3 столбца, которые называются manager_id, supervisor_id, worker_id. Все три столбца имеют ссылку на таблицу сотрудников (таблица B). Но в JPA, когда менеджер сущностей строит сущность A (соответствующую таблице A), если более одного из трех столбцов имеют одинаковый идентификатор, сущность A не будет иметь отдельные объекты сущности B, но будет указывать на одну и ту же ссылку , (Например, если manager_id и supervisor_id равен «12345», то при построении объекта A поля, сопоставленные с manager_id и supervisor_id, будут указывать на один и тот же ссылочный объект объекта B с id = '12345'

Это нормально до времени коммита. Всякий раз, когда я меняю manager_id tp '67891', supervisor_id также сохраняется с этим идентификатором, потому что они указывают на одну и ту же ссылку. Это не верно. Как я могу настроить каркас для получения отдельных ссылочных объектов для каждого атрибута независимо от того, указывают ли они на один и тот же объект или нет, или указать, что менеджер сущностей сохраняет только поле, которое было изменено? Я не хочу писать собственный запрос для этого.

Любой совет будет высоко ценится!

1 Ответ

0 голосов
/ 26 августа 2011

Если столбцы manager_id и supervisor_id таблицы базы данных имеют одинаковое значение, то соответствующие свойства в объекте будут указывать на один и тот же объект. Это нормальное, правильное поведение JPA, и вы не должны или не должны этого избегать.

Вы говорите об изменении значения manager_id. Как ты это делаешь? Я считаю, что вы должны иметь возможность изменить объект , к которому относятся соответствующие свойства, и иметь JPA для правильного изменения значения в базе данных.

В коде:

@Entity
public class A {
    @ManyToOne @Column(name="manager_id")
    private B manager;
    @ManyToOne @Column(name="supervisor_id")
    private B supervisor;
    @ManyToOne @Column(name="worker_id")
    private B worker;

    public void setManager(B manager) {
        this.manager = manager;
    }
}

A a;
B b67891;
a.setManager(b67891);

Чтобы увидеть полный, автономный пример этого, см .:

...