在旧数据库(JPA)中将null列映射为0

时间:2010-06-07 07:56:59

标签: database jpa null legacy playframework

使用Play!框架和它的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 个答案:

答案 0 :(得分: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;
       }
    }
}

答案 1 :(得分:0)

我看到两个选项:

  • 使用原始数据类型Id(即int代替Integer
  • 如果您使用Hibernate作为JPA提供程序,请使用CustomType进行转换