Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA如何推断属性的数据类型_Java_Hibernate_Scala_Jpa - Fatal编程技术网

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

Java JPA如何推断属性的数据类型,java,hibernate,scala,jpa,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类型编写UserT

典型的JPA实体如下所示:

@Entity
public class Person {
  @Id
  private int id;
  private String name;
  private int age;
  private Calendar anniversary;
  ...
}
请注意,数据类型未在任何成员属性上注释

我刚刚读了一篇关于Hibernate不能与Scala的数据类型一起使用的文章,我想知道我们是否可以编写一些适配器。我知道我们可以为Scala类型编写UserTypes,为Scala的集合编写UserCollectionTypes,这样就可以使用适配器


我的问题是,我能否以某种方式配置这些数据类型,以便JPA自动将它们与相应的Scala类型关联,例如,BigDecimal的用户类型与BigDecimal属性,不必用@Type注释每个属性?

您缺少的是,大多数实现中的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查询,从personp中选择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正在做的。你在冬眠或日食中看到的所有方言。。。我们正在这样做。拿灵长类来说,当你说长的时候,我是指大整数,当你说字符串的时候,我想是VARCHAR2048。但是,您可以使用@Column这样的注释细化这些默认值

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

我强烈建议您了解数据库的方言,并阅读代码。还不错。Hibernate为初学者提供了极好的文档。若你们不懂SQL,若你们在和JPA一起工作,就尽快学习它。您需要它。

我甚至不是Scala的初学者,但要回答您关于类型的问题:是的,在您的示例中,它们都是明确键入的。每个元素的类和基元类型对应于大多数语言中的公共数据类型,因此很容易反映并确定类型。Scala可以在JVM上运行,因此我假设您可以以某种形式访问信息。JPA除了使用注释外,还使用反射来映射实体。我希望这有帮助。编辑->清晰:注释并不仅仅决定JPA的类型。@DanielChapman,谢谢你的回答!不,这并不是关于scala的,您是对的,JPA必须使用反射,但我想了解它实际上是如何将这些类型映射到java到SQL的,以及这是否是可扩展的。我可以做@类型注释,但这将是一种痛苦,所以如果我能告诉JPA也考虑我的自定义类型,代码将如同它的“正则”java类型一样无缝!下面我给出了一个更好的解释——看看JBoss上的hibernate教程,它们是一个很好的开始。在您展示的示例中,Account可能是数据库表中的一个实体。如果我的自定义数据类型是MyAwesomeList,它实现了一个集合(如java.util.List实现)并存储帐户,该怎么办。我想存储帐户,而不是MyAwesomeList的表。我可以在hibernate中使用用户类型来完成所有这些工作,我只是不知道如何告诉JPA应该像对待泛型java类型那样含蓄地对待它们。JPA是一个规范,hibernate是一个实现,它确实启发了JPA,并且有很多JPA没有的特性。JPA2可能支持这种行为——不过我不知道。这里有一个问题:如果hibernate适合您,为什么要使用JPA?如果它在Hibernate中映射并持续存在,您就有了一个解决方案。也许其他人会有答案。您应该考虑以JPA持久性集合作为关键字,看看是否有人正在寻找您正在寻找的解决方案。我会避免长期存储的序列化,我认为hibernate就是这样做的。。。我相信Hibernate将集合序列化为一个BLOB,然后将其读回。这是一个危险的长期解决方案,因为您无法更新它。然而,在JPA中可能有一种方法可以实现这一点。就配置而言,JPA+hibernate比纯hibernate更整洁,因此具有诱惑力: