1

使用播放!框架和它的 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,而从数据库读取时如何强制空值为 0?

4

2 回答 2

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;
       }
    }
}
于 2010-06-07T11:43:55.633 回答
0

我看到两个选项:

  • 使用原始数据类型作为Id(即int代替Integer
  • 如果您使用 Hibernate 作为 JPA 提供程序,请使用 aCustomType进行转换
于 2010-06-07T14:32:38.933 回答