как просто добавить объект в коллекцию в спящем режиме от клиента - PullRequest
3 голосов
/ 06 января 2010

Я пытаюсь добавить объект в коллекцию в моем представлении клиента и сохранить его на сервере с помощью механизма hibernate / jpa.

Вот проблема: Возьмите объект Group, который может содержать объекты Account.

В моем представлении клиента (gwt) я создаю новую группу (поэтому идентификатор равен нулю) и добавляю в эту группу несколько учетных записей (где существуют идентификаторы). НО эти учетные записи инициализируются в клиенте с их идентификатором и псевдо только через окно подсказки (потому что я не хочу загружать пароль и другие вещи в моем представлении клиента)

Когда моя группа возвращается на сервер, я пытаюсь сохранить ее с моим дао, и у меня появляется эта ошибка: Свойство not-null ссылается на нулевое или временное значение

Вот моя ассоциация в объекте Group:

@ManyToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH })
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public Set<Account> getAccounts()
{
    return accounts;
}

поэтому сохранение должно быть выполнено автоматически. Но я думаю, что проблема в том, что я использую частичные объекты учетной записи с существующим идентификатором.

Мой вопрос: как я могу добавить простую ассоциацию (просто добавить запись в таблицу manyToMany), не загружая все объекты, которые я хочу добавить (потому что мне это не нужно, я просто хочу добавить ассоциацию между два идентификатора)

EDIT: больше информации на примере: У меня есть группа, свойства которой ID: "G1" имя: "group1"

У меня есть аккаунт, свойства которого ID: "A1" Псевдо: "Jerome" пароль: "pass1" Статус: «включено» день рождения: «хххх» ...

Из моего клиентского интерфейса (сделано с gwt) я загружаю объект group1 Из автозаполнения я загружаю объекты Account, но только с полем id и псевдо (я не хочу загружать весь объект) Я добавляю объект Account "Jerome" с идентификатором "A1" в мою группу.

Я отправляю свою группу на сервер, чтобы сохранить ее. На сервере я использую транзакционный метод, который сохраняет группу, вызывая: groupDAO.update (myGroup1)

Поскольку мой объект Account в этом объекте Group частично загружен, это вызывает ошибку.

Итак, как я могу добавить связь между моей группой и учетной записью, не загружая весь объект Account? Я не хочу такой код:

List newList = new ArrayList();
for (Account acc : myGroup1.getAccounts())
{
    Account accLoaded = accountDAO.findById(acc.getId());
    newList.add(accLoaded);
}

myGroup1.setAccounts(newList);
groupDAO.save(myGroup1);

спасибо

1 Ответ

4 голосов
/ 07 января 2010

Ваша цель:

Я просто хочу добавить связь между двумя идентификаторами без загрузки всего объекта. Account

Вы сказали:

Мне кажется, проблема в том, что я использую частичные объекты учетной записи с существующим идентификатором

Вы правы. Предположим, что следующее

public class Account {

    private Integer id;

    private Integer accountNumber;

    @Id
    public Integer getId() {
        return this.id;
    }

    @Column(nullable=false)
    public Integer getAccountNumber() {
        return this.accountNumber;
    }

}

Поэтому, когда вы звоните

Group group = new Group();

// Notice as shown bellow accountNumber is null
Account account = new Account();
account.setId(1);

group.addAccount(account);

entityManager.persist(group);

Итак, из-за CascadeType.PERSIST вы говорите

Сохранение каждой указанной учетной записи

Но каждое упомянутое свойство AccountNumber Account имеет значение null. Это объясняет, почему вы получаете свое исключение

Вместо загрузки полностью инициализированной учетной записи Вы можете использовать что-то вроде

// If you do not want to hit the database
// Because you do not need a fully initialized Account
// Just use getReference method
Account account = entityManager.getReference(Account.class, new Integer(accountId));

Так что нет смысла загружать каждую полностью инициализированную учетную запись без какой-либо цели или причины.

С уважением,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...