#java #hibernate #jpa
#java #перевести в спящий режим #jpa
Вопрос:
Недавно я нашел такое отображение в нашем репозитории:
@Entity
...
public class Foo{
...
@OneToMany(mappedBy = "someField", cascade = CascadeType.ALL, orphanRemoval = true)
public Set<Bar> bars;
...
}
@Entity
@IdClass(Bar.Key.class)
...
public class Bar{
@Id
public long someField;
@Id
public long anotherField;
...
static class Key implements Serializable {
public long someField;
public long anotherField;
}
}
В обеих таблицах нет внешних ключей.
Я был удивлен, что в @ManyToOne
классе нет Bar
поля и @OneToMany
оно аннотируется без @JoinColumn
as mappedBy
. В любом случае это работает отлично: без избыточных обновлений — как будто это двунаправленное отображение. Я не эксперт в JPA / Hibernate, и я никогда не видел такого сопоставления в руководствах / документации. Я попытался погуглить такое отображение, но не нашел никакого объяснения. Можно ли сопоставлять подобные объекты?
Спасибо!
Ответ №1:
Двунаправленные сопоставления «один ко многим» и «многие к одному» в порядке. Но вам следует избегать однонаправленных связей «один ко многим» в вашей модели предметной области. В противном случае Hibernate может создать неожиданные таблицы и выполнить больше инструкций SQL, чем вы ожидали.
Определение однонаправленной ассоциации «один ко многим», похоже, не является проблемой. Вам просто нужен атрибут, который отображает ассоциацию и отношение @OneToMany.
Ссылка см. ссылку
Комментарии:
1. @MS90 Вопрос в том, «Нормально ли отображать объекты, подобные этому?» Ответ таков: «вам следует избегать, потому что он выполняет больше инструкций SQL, чем вы ожидали».
2. Можете ли вы уточнить, какие дополнительные инструкции SQL (кроме необходимой) выполняются? @Khalid Shah
3. @MS90 я также предоставляю ссылку для этого. вы можете прочитать пример оттуда 🙂
4. Взгляните на раздел «Использование orphanRemoval при моделировании родительско-дочерних ассоциаций» этой статьи. @Khalid Shah. Я дал 1 за хорошую ссылку.