Hibernate Обновление ManytoMany - PullRequest
       1

Hibernate Обновление ManytoMany

0 голосов
/ 06 марта 2020

У меня есть одно отношение много ко многим на моем sql

İmage

и вот мои 2 сущности медиа и жанр

@Entity(name = "genre")
public class Genre_entity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int genre_id;
    @Column(name="genre_Nom")
    private String genre_name;

    @ManyToMany(mappedBy = "genres", cascade = CascadeType.PERSIST)
    private Set<Media_entity> medias = new HashSet<>();

@Entity(name="media")
public class Media_entity {
    @Id
    @GeneratedValue (strategy = GenerationType.IDENTITY)
    private Integer media_id;

    @Column(name = "media_Titre")
    private String media_title;

    @Column(name = "media_AnneeSortie")
    private Integer media_year;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="typeMedia_Id")
    private MediaType_entity mediaType;

    @Column(name = "valid")
    private boolean media_valid ;

    @ManyToMany(fetch = FetchType.LAZY,cascade = CascadeType.PERSIST)
    @JoinTable(
            name =  "media_genre",
            joinColumns  = {@JoinColumn(name="media_Id")},
            inverseJoinColumns = {@JoinColumn(name="genre_Id")}
            )
    private Set<Genre_entity> genres = new HashSet<>();

Работает без проблем до тех пор, пока не захочу отредактировать таблицу "media_genre". я получил эту ошибку

object references an unsaved transient instance - save the transient instance before flushing: entity.Genre_entity

вот мой тестовый код

public void editFilm(Integer id, String mediaTitle , Integer mediaYear, String[] listGenre) {
            Session session = null;
            Transaction tx = null;

            try {
                session = HibernateUtil.getSessionFactory().getCurrentSession();
                tx = session.beginTransaction();
                Media_entity media = getMediaByIdSimple(id);
                media.setMedia_title(mediaTitle);
                media.setMedia_year(mediaYear);

                for (String str : listGenre) {
                    Genre_entity genre = new Genre_entity();
                    genre.setGenre_name(str);
                    media.addGenre(genre);  
                }
                session.merge(media);
                tx.commit();

            } catch (Exception e) {
                if (tx != null) {
                    tx.rollback();
                }
                e.printStackTrace();
            }
            finally {
                if(session != null) {
                    session.close();
                }
            }

        }

Я просто хочу отредактировать эту таблицу "media_genre", не меняя эти два объекта медиа и жанр.

Спасибо

Ответы [ 2 ]

0 голосов
/ 07 марта 2020

Я видел ваше решение, но, чтобы помочь с первой ошибкой, о которой вы сообщили:

object references an unsaved transient instance - save the transient instance before flushing: entity.Genre_entity

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

0 голосов
/ 07 марта 2020

Я нашел способ, с помощью которого Hibernate просто вставляет новое обновление в мою ассоциацию таблиц media_genre без вставки или требует новой вставки в жанр сущности моей таблицы. Я просто загружаю свой старый объектный жанр, который уже существует в моей базе данных, вместо созданного нового объекта, затем я добавляю новую коллекцию к этому объекту. С этим Hibernate вставьте только новые коллекции в мою таблицу только media_genre. вот код завершения

public void editFilm(Integer id, String mediaTitle , Integer mediaYear, String[] listGenre) {
            Session session = null;
            Transaction tx = null;
            Genre_entity genre = null;
            try {
                session = HibernateUtil.getSessionFactory().getCurrentSession();
                tx = session.beginTransaction();
                Media_entity media = getMediaByIdSimple(id);
                media.setMedia_title(mediaTitle);
                media.setMedia_year(mediaYear);
                for (String str : listGenre) {
                    Query<Genre_entity> q = session.createQuery("select g from genre g where g.genre_name = ?0", Genre_entity.class);
                    q.setParameter(0, str);
                    genre = q.getSingleResult();
                    genre.setGenre_name(str);
                    media.addGenre(genre);  
                }
                tx.commit();

            } catch (Exception e) {
                if (tx != null) {
                    tx.rollback();
                }
                e.printStackTrace();
            }
            finally {
                if(session != null) {
                    session.close();
                }
            }

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