JPA如何推断属性的数据类型

时间:2011-11-28 17:54:29

标签: java hibernate scala jpa

典型的JPA实体如下:

@Entity
public class Person {
  @Id
  private int id;
  private String name;
  private int age;
  private Calendar anniversary;
  ...
}

请注意,数据类型未在任何成员属性上注释。

我刚刚阅读了一篇关于Hibernate的说明,它与Scala的数据类型不太一样,并且想知道我们是否可以编写一些适配器。我知道我们可以为Scala类型编写UserType,为Scala的集合编写UserCollectionType s,因此可以使用适配器。

我的问题是我可以以某种方式配置这些数据类型,因此JPA会自动将它们与相应的Scala类型(例如BigDecimal的用户类型与BigDecimal属性)相关联,而无需为每个类型添加注释属性为@Type

1 个答案:

答案 0 :(得分:0)

您缺少的是JPA(在大多数实现中)映射到关系数据库,因此它将映射到SQL类型。因此,如果您正在查看上面的实体,如果您指定它,它将映射到序列化对象,但更常见的是它将映射到结构。

让我们玩您的实体并为其添加一个帐户:

@Entity 
public class Account
{
  @Id
  private int id;
  private String name;
  private String password; //no bad don't do this really
}

@Entity
public class Person {
  @Id
  private int id;
  private String name;
  private int age;
  private Account account; //custom type
  private Calendar anniversary;
  ...
}

如果我运行JPQL查询"SELECT p FROM Person p"我将获得 - >>

  Person@AAAAAAAA //some memory with a member child of Account@BBBBBBBB

在数据库中看起来像:

SELECT
  p.*,
  a.*
FROM
  Person p INNER JOIN Account a 
    ON p.account_id = a.id

"自定义类型"刚刚结束为另一个表中的基元集合。一般来说,这就是你想要的JPA。您尝试在99%的时间内尝试映射到RDBMS,并且您尝试不使用javax.sql,因为您最终可能会因为检查异常而感到沮丧。

基本上:将其视为数据库而不是您的自定义类型。这就是JPA正在做的事情。你在Hibernate或Eclipselink等中看到的所有方言都是这样做的。采取灵长类动物,然后说"当你说Long时,我的意思是BigInteger当你说String我认为VARCHAR(2048)时。但是,您可以使用@Column等注释来优化这些默认值

...
@Column(name="xyz", length="80")
private String name
...
//maps to
COLUMN xyz VARCHAR(80)

我强烈建议您查看您知道的数据库的方言并阅读代码。这不是太糟糕。 Hibernate为初学者提供了很棒的文档。如果您不了解SQL,请尽快学习如果您正在使用JPA。你需要它。