典型的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
?
答案 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。你需要它。