Приложения Java или .Net сильно зависят от рефлексии или нет? - PullRequest
2 голосов
/ 13 октября 2010

Предположим, у меня есть приложение на Java или C #, в котором у меня есть классы, такие как Book, Library, Author, ... и я хочу простой способ привязать эти элементы к базе данных или показать их в сетке данных.

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

  • добавлен новый класс (например, Loaner, Publisher, ...)
  • добавлен новый универсальный модуль (например, модуль отчетности, в котором пользователь может выбирать, какую информацию о классе показывать в отчете)

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

Для отображения базы данных можно использовать такие инструменты, как Hibernate, но полагается ли Hibernate также на рефлексию или вам необходимо реализовать явный интерфейс для каждого из ваших классов, чтобы использовать Hibernate?

Ответы [ 3 ]

1 голос
/ 13 октября 2010

Вот хорошая статья , посвященная некоторым вопросам. Hibernate использует отражение во время выполнения, но иногда вам придется немного настраиваться. Полная автоматизация проблемы постоянства еще не наступила. Одним из больших преимуществ рефлексии является меньшая вероятность человеческой ошибки.

1 голос
/ 13 октября 2010

Если вы отображаете данные в базу данных, вы, вероятно, захотите изучить стандарт Java Persistence Architecture (JPA).Классы снабжены тегами, которые определяют поля таблицы, отношения и т. Д., Не оказывая существенного влияния на то, как код, который не заинтересован в этом материале, взаимодействует с классом.Другими словами, это POJO.

Реализации JPA, такие как Hibernate и OpenJPA, используют аннотации для загрузки / сохранения сущности из источника данных, который обычно является базой данных SQL, но, строго говоря, это не обязательно.

Класс, который хранится в базе данных, аннотируется как @Entity и содержит поля, которые могут быть постоянными или временными.Вы также можете указать @Column для поля, которое отображается в базе данных, и использовать аннотации @OneToOne, @ManyToOne и @OneToMany с @JoinTable, @JoinColumn для определения отношений между правами.

Объектыхранится / извлекается через EntityManager и язык запросов.

например,

@Entity
@Table(name = "BOOKS")
class Book {
  @Id
  @Column(name = "BOOK_ID")
  int bookId;

  @ManyToOne
  @JoinColumn(name = "AUTHOR_ID", insertable = false, updatable = false)
  Author author;

  @Column(name = "TITLE")
  String title;

  @Transient
  double relevanceScore;
}

@Entity
@Table(name = "AUTHORS")
class Author {
  @Id
  @Column(name = "AUTHOR_ID")
  int id;

  @Column(name = "NAME")
  String name;

  @OneToMany(mappedBy = "AUTHORS")
  @JoinColumn(name = "AUTHOR_ID")
  Set<Book> books;
}

И использовать его:

Query q = getEntityManager.createQuery("SELECT b FROM Book b WHERE b.title = :title");
q.setParameter("title", title);
return q.getResultList();

В случае Hibernate у вас есть выбор: использовать аннотации в стиле JPA или внешние файлы сопоставления XML,Аннотации, вероятно, легче поддерживать в большинстве случаев, но XML может быть полезен, если вы хотите поэкспериментировать с отображениями во время выполнения, не перестраивая исходный код.Последнее может быть полезно, если у вас есть одна сущность, и в зависимости от развертывания она хранится в разных источниках данных.

1 голос
/ 13 октября 2010

Да, NHibernate активно использует рефлексию. Для рендеринга сеток взгляните на шаблоны данных в WPF, так как вы сможете управлять рендерингом разных ячеек в зависимости от типа данных, отображаемых в столбце.

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