Сопоставить нулевой столбец с 0 в устаревшей базе данных (JPA) - PullRequest
1 голос
/ 07 июня 2010

Использование Play! Framework и его класс 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 как NULL, то, как ожидается, JPA вставит значение NULL в этот столбец базы данных. Как я мог заставить нулевые значения быть 0 при записи в базу данных и наоборот при чтении из базы данных?

Ответы [ 2 ]

2 голосов
/ 07 июня 2010

Я не вижу простого способа добиться того, что вы хотите, с помощью 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;
       }
    }
}
0 голосов
/ 07 июня 2010

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

  • Использовать примитивный тип данных как Id (т.е. int вместо Integer)
  • Если вы используете Hibernate в качестве JPAпровайдер, используйте CustomType для конвертации
...