Столбец пустого указателя карты как 0 в унаследованной базе данных (JPA)

Использование Игры! платформа и это являются классом JPASupport, я столкнулся с проблемой с унаследованной базой данных.

У меня есть следующий класс:

@Entity
@Table(name="product_catalog")
public class ProductCatalog extends JPASupport {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Integer product_catalog;

    @OneToOne
    @JoinColumn(name="upper_catalog")
    public ProductCatalog upper_catalog;

    public String name;
}

Некоторые каталоги продукции не имеют верхнего каталога, и на это ссылаются как 0 в унаследованной базе данных. Если я предоставляю upper_catalog как ПУСТОЙ УКАЗАТЕЛЬ, то как и следовало ожидать JPA вставляет Нулевое значение в тот столбец базы данных. Как я мог вынудить нулевые значения быть 0 при записи в базу данных и наоборот при чтении из базы данных?

1
задан Peter Hilton 27 August 2010 в 14:15
поделиться

2 ответа

Я не вижу простого способа достичь желаемого напрямую с помощью JPA (и есть большая вероятность, что даже если вы найдете способ, который работает с базовыми операциями, такими как сохранение или загрузка, он не будет работать с более сложными вариантами использования, такими как сложные критерии / hql, отсутствие стандартного режима выборки и т. д.)

Я бы сделал это:

@Entity
@Table(name="product_catalog")
public class ProductCatalog extends JPASupport {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Integer product_catalog;

    @Column(name="upper_catalog")
    public Long upper_catalog_id;

    public String name;

    public ProductCatalog getUpperCatalog() {
       if (upper_catalog_id == 0)
         return null;

       return ProductCatalog.findById(upper_catalog_id);
    }

    public void setUpperCatalog(ProductCatalog pc) {
       if (pc == null) {
         upper_catalog_id = 0;
       }
       else {
         if (pc.id == null) {
            // option 1. a bit like a cascade
            pc.save();
            // option 2. if you consider passing a transient entity is not valid
            throw new RuntimeException("transient entity " + pc.toString());
         }
         upper_catalog_id = pc.id;
       }
    }
}
2
ответ дан 3 September 2019 в 00:00
поделиться

Я вижу два варианта:

  • Использовать примитивный тип данных как Id (т.е. int вместо Integer )
  • Если вы используете Hibernate в качестве поставщика JPA, используйте CustomType для преобразования
0
ответ дан 3 September 2019 в 00:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: