Как помешать Hibernate активно загружать отношения, когда они отображаются с использованием столбца (referencedColumnName), отличного от первичного ключа? - PullRequest
0 голосов
/ 09 мая 2019

Я сопоставляю отношения, в которых не используется первичный ключ сущности.Использование «referencedColumnName» со столбцом, отличным от первичного ключа, заставляет hibernate охотно извлекать ассоциацию, выдавая дополнительный выбор, даже если он помечен как FetchType.LAZY.

Моя цель - заставить его вести себя какрегулярное сопоставление, означающее, что он не будет выдавать дополнительный запрос каждый раз, когда мне нужно запросить основную сущность.

Я уже пытался использовать @LazyToOne (LazyToOneOption.NO_PROXY), что решает проблему, но этоне работает с модулем Джексона (библиотека синтаксического анализа JSON) "jackson-datatype-hibernate5", который пропускает ленивые прокси гибернации при сериализации результатов.

Вот сценарий, почти такой же, как у меня, который вызывает проблему:Entities:

@Entity(name = "Book")
@Table(name = "book")
public class Book
    implements Serializable {

    @Id
    @GeneratedValue
    private Long id;

    private String title;

    private String author;

    @NaturalId
    private String isbn;

    //Getters and setters omitted for brevity
}

@Entity(name = "Publication")
@Table(name = "publication")
public class Publication {

    @Id
    @GeneratedValue
    private Long id;

    private String publisher;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(
        name = "isbn",
        referencedColumnName = "isbn"
    )
    private Book book;

    @Column(
        name = "price_in_cents",
        nullable = false
    )
    private Integer priceCents;

    private String currency;

    //Getters and setters omitted for brevity
}

Репозиторий (Spring-Data, но вы можете попробовать напрямую с EntityManager):

@Repository
public interface PublicationRepository extends JpaReadRepository <Publication, Long>
{
    @Query ("SELECT d FROM Publication d WHERE d.publisher = ?1 ")
    Optional <Publication> findByPublisher (String isbn);
}

Спасибо

1 Ответ

1 голос
/ 29 мая 2019

Единственный способ добиться того, что вы ищете, - переместить аннотацию @Id в свойство isbn.

Вы можете оставить @GeneratedValue в свойстве автоинкремента.

Примечания:

1 - Убедитесь, что ваши equals / hc следуют OID (ID объекта) в вашем домене, а именно ISBN "NaturalId".

2 - Было бы хорошо по возможности убедиться на уровне БД, что ваш естественный идентификатор имеет уникальные противопоказания.

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