Ошибка со списком <Long>с использованием PlayFramework и JPA - PullRequest
3 голосов
/ 11 июля 2011

Я работаю над проектом с использованием Play! Framework, и у меня есть некоторые проблемы с JPA.Кажется, что он не сохраняет мой список или не может извлечь его из БД.

Вот мой класс пользователя:

@Entity
public class User extends Model {
    public String login;
    public String password;
    public String name;
    public String email;
    @ElementCollection
    public List<Long> eventStreamIds;
    @Transient
    UserEventBuffer eventBuffer;

    public User(String login, String password, String name, String email, ArrayList<Long> eventStreamIds) {
        this.login = login;
        this.password = password;
        this.name = name;
        this.email = email;
        this.eventStreamIds = eventStreamIds;
            UserEventBuffer eventBuffer = new UserEventBuffer();
        }
}

У меня есть другой класс,ModelManager, конструктор которого выглядит следующим образом:

public ModelManager() {
    User u = new User("user1", "pwd", "Alex", "test@test.com");
    EventStreamMC eb = new EventStreamMC("http://www.wservice.com/stream1");
    streams.add(eb);
    u.eventStreamIds.add(eb.id);
    Logger.info("before : " + u.eventStreamIds.size());
    u.save();
    User u2 = User.find("byLoginAndPassword", "user1", "pwd").first();
    Logger.info("after : " + u2.eventStreamIds.size());
}

(Мой EventStreamMC также расширяет Model и имеет тег @Entity, поэтому его длинный идентификатор генерируется автоматически) Когда я запускаю этот код, вот результат:

before = 1
after = 0

Итак, список пуст после вызова метода find ().

Как я могу заставить его работать?

1 Ответ

4 голосов
/ 11 июля 2011

ID генерируется только при сохранении, а eb никогда не сохраняется в вашем коде.ed.id будет пустым, когда вы добавите его в свой список.

РЕДАКТИРОВАТЬ:

Я пойду немного дальше в моих объяснениях.

Первый регистратор возвращает 1, поскольку это объект списка Java.Это простой список, вы добавляете элемент, и размер увеличивается.Здесь нет сюрпризов.Обычная Ява.И абсолютно ничего общего с Play !.

Второй регистратор ничего не отображает, так как ID генерируется при фиксации точно.А поскольку вы все еще находитесь в той же транзакции, сохранение не выполняется до самого конца выполнения.Если вы действительно хотите, чтобы это работало в той же HTTP-заявке / транзакции, используйте это:

Model.em().getTransaction().commit();

Для получения дополнительной информации ознакомьтесь с официальной документацией Play по Транзакции .

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