Nano Hash - криптовалюты, майнинг, программирование

Столбец дискриминатора не установлен во вновь сохраненном объекте

У меня есть сущность базового класса, которая выглядит так:

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "IDTYPE",
    discriminatorType = DiscriminatorType.STRING,
    length = 12)
public class ProtoObject implements Serializable {

  private static final long serialVersionUID = 1L;
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  @Column
  private String              idtype;

  // more columns

У меня есть несколько подклассов, которые я создаю и сохраняю. Однако я обнаружил, что даже если для столбца idtype устанавливается то, что я ожидал в базе данных (проверка с помощью отдельного инструмента браузера БД), объекты Java idtype свойство не устанавливается для тех объектов, которые EntityManager имеет в своем кеше.

Если я выполняю поиск объектов с помощью EntityManager, для последних сохраненных объектов idtype оказывается пустым! Если я закрою приложение и снова открою его, данные появятся в порядке.

Это приложение JSF 2, использующее EclipseLink 2.3.2.v20111125-r1046.

Это известная проблема и может ли кто-нибудь предложить обходной путь?

20.11.2012

Ответы:


1

Вы не установили атрибут при создании объекта, чтобы отразить то, что вы хотели отправить в базу данных. Вам нужно установить поле, чтобы оно оставалось согласованным в кеше, поскольку объекты JPA обрабатываются как обычные объекты Java и не будут исправлять ситуацию за вас. Или после сохранения вы можете сбросить изменения, чтобы они обновили объект, чтобы поле было заполнено тем, что находится в БД.

20.11.2012
  • Вам также необходимо пометить атрибут idtype как insertable=false, updateable=false, иначе он будет конфликтовать с отображением поля дискриминатора наследования. 20.11.2012
  • Интересный. Поскольку столбец устанавливается, когда он помещается в базу данных, я предположил, что это свойство также должно быть установлено. Он получает значение имени класса Java. Это отличается от того, как работает поле ID, и я не видел этого ни в одном примере кода. Спасибо за заметку. 20.11.2012
  • JPA позволяет получить доступ к полю в запросах, используя ключевое слово TYPE, поэтому не должно быть особой необходимости в отображении поля. Если этого недостаточно, его можно установить в событии, таком как PrePersist, чтобы он был согласован в кеше. выберите p из Project p, где TYPE (p) in (LargeProject, SmallProject) 21.11.2012
  • У меня возникла потребность в отображении столбца, потому что я не мог понять, как еще выполнить запрос критериев, где значение DiscriminatorColumn упоминается в предложении WHERE. Генератор исходного кода EclipseLink не создает ссылку для этого столбца, пока я этого не сделаю. 21.11.2012
  • В API Criteria Join есть метод type(), который можно использовать для доступа к этому полю. Вы также можете добавить собственный ключ запроса EclipseLink для поля базы данных, а не сопоставление для доступа к полю в запросах, но сопоставление будет работать нормально с упомянутым предостережением. 22.11.2012

  • 2

    Вы можете обновить кеш после сохранения:

        this.entityManager.persist(protoObject);
        this.entityManager.flush();
        this.entityManager.refresh(protoObject);
    
    26.06.2014
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..