Play Framework и использование коллекций в модельных классах - PullRequest
3 голосов
/ 09 августа 2011

Я только начал с Play Framework и столкнулся с некоторыми проблемами при использовании коллекции в одном из моих классов моделей.Я очень новичок в Play и JPA / Hibernate, поэтому, пожалуйста, извините меня за noobness ... Я пытался искать в Интернете ответы, но не мог найти то, что я искал.

По сути, у меня есть2 модели:

@Entity
public class Song extends Model
{
    @Column(unique = true)
    public int songId;
    public String name;
    public String artist;

    public Song() {}

    public Song(int songId, String name, String artist)
    {
        this.songId = songId;
        this.name = name;
        this.artist = artist;
    }
}

@Entity
public class CurrentSongList extends Model {

    @OneToMany(orphanRemoval=false)
    public List<Song> currentSongList;
}

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

Fixtures.deleteDatabase();
Fixtures.loadModels("songlist.yaml");

List<Song> songs = Song.findAll();
CurrentSongList.deleteAll();
CurrentSongList currentSongs = new CurrentSongList();
currentSongs.currentSongList = new ArrayList<Song>();
currentSongs.currentSongList.add(songs.get(0));
currentSongs.currentSongList.add(songs.get(1));

EntityManager em = JPA.em();
em.persist(currentSongs);
em.flush();

Если я пропущу вызов сброса, список не будет сохранен при извлечении его содержимого из БД в дальнейшем.Однако вызов flush приводит к следующему исключению:

Caused by: org.hibernate.HibernateException: Found two representations of same collection: models.CurrentSongList.currentSongList
    at org.hibernate.engine.Collections.processReachableCollection(Collections.java:175)
    at org.hibernate.event.def.FlushVisitor.processCollection(FlushVisitor.java:60)
    at org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:122)
    at org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:83)
    at org.hibernate.event.def.AbstractVisitor.processEntityPropertyValues(AbstractVisitor.java:77)
    at org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:165)
    at org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:240)
    at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:99)
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1216)
    at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:383)
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:133)
    at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:76)

Я понимаю, что, возможно, я делаю здесь что-то глупое (действительно ли flush () после persist действительно необходимо?) И не понимаю, как работает этот материалкак бы то ни было, но я изо всех сил пытался найти информацию по этой проблеме.Буду очень признателен за любую помощь в достижении вышеизложенного.

Спасибо!

1 Ответ

2 голосов
/ 10 августа 2011

С Play Framework вам не нужно звонить persist.Попробуйте позвонить

currentSongs.save();

Кроме того, Play Framework автоматически создаст идентификатор для вашей модели песни.Таким образом, вам может не потребоваться songId, если только это не предопределенное значение, которое вы хотите сохранить.

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