Hibernate - удалить команды вставки db об elementcollection

@Embeddable
class Y {
    protected Y(){}
    @Column(nullable = false)
    int i;
    @Column(nullable = false)
    int j;
}
@Entity
class X {
    protected X(){}
    @Id
    @Column(name = "id")
    int id;

    @ElementCollection(fetch = FetchType.EAGER)
    Set<Y> s = new HashSet<>();
}

Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
X a = new X();
a.s.add(new Y());

session.save(a);
transaction.commit();
session.close();

Карта Hibernate в таблице x_s содержит 3 столбца с идентификаторами x, i и j. Однако, если сделать отдельный объект, чтобы он сохранялся снова, обновив, например:

Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
X x = session.get(X.class, 0);
transaction.commit();
session.close();

Session session1 = sessionFactory.openSession();
Transaction transaction1 = session1.beginTransaction();
session1.saveOrUpdate(x); // and select or update should execute
transaction1.commit();
session1.close();

Странно то, что кроме select, hibernate будет удалять и вставлять, приведенный выше код сгенерирует:

Hibernate: select x0_.id as id1_0_0_, s1_.X_id as X_id1_1_1_, s1_.s_i as s_i2_1_1_, s1_.s_j as s_j3_1_1_ from X x0_ left outer join X_s s1_ on x0_.id=s1_.X_id where x0_.id=?
Hibernate: delete from X_s where X_id=? and s_i=? and s_j=?
Hibernate: insert into X_s (X_id, s_i, s_j) values (?, ?, ?)
Hibernate: select x_.id from X x_ where x_.id=?
Hibernate: delete from X_s where X_id=? and s_i=? and s_j=?
Hibernate: insert into X_s (X_id, s_i, s_j) values (?, ?, ?)

Согласно этому отвечать, он говорит, что причина в том, что в таблице x_s нет pk. Но таблица x_s, сгенерированная спящим режимом, уже использует все 3 столбца как объединенный pk.

Кажется, единственный способ устранить эти команды вставки и удаления - это изменить Set<Y> на List<Y>, спящий режим автоматически добавит порядок столбцов и объединит порядок и x_id как pk. Но с точки зрения схемы БД это не существенная разница.

P.S Я использую спящий режим 5.3

0
0
81
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Очевидно, что JPA видит, что объекты не равны, очищаются и повторно вставляются. Пожалуйста, попробуйте переопределить equals() и hashcode() для объекта Embeddable. При реализации по умолчанию объект считается равным только по ссылке, чего не было бы в вашем случае.

Другие вопросы по теме