2

我是 JPA 的新手,并且无论如何都在 Java 中使用持久性,我有两个问题我无法解决:我生成的标签为:

@JoinColumn(name = "UserName", referencedColumnName = "UserName")
@ManyToOne(optional = false)
private User userName;
@JoinColumn(name = "DatasetNo", referencedColumnName = "DatasetNo")
@ManyToOne(optional = false)
private Dataset datasetNo;

但是在该类的一个构造函数中,没有对列 UserName 或 DatasetNo 进行引用,而在构造函数中引用了类中的所有其他列。

谁能告诉我这是为什么?两列 UserName 和 DatasetNo 都是实体 Visualization 上的“外键”,它对应于同名的数据库表。我不能完全解决ORM。

在使用实体类或 POJO 时,最好使用以下类变量:

私人用户用户名;

指定类的实例或仅指定该类实例的键的位置,例如:

私人字符串用户名;

谢谢

摩根先生。

4

2 回答 2

2

构造函数的编写方式只是您用来从模式创建类的任何自动生成工具的一个特性。如果您想要一个接受它们的构造函数,请随意添加它。需要知道您使用的是哪一个以及它是如何配置的以评论它为什么会这样工作:)

通常最好映射实际的对象关系。毕竟这就是 ORM 的全部意义,不是吗?拥有一个实际的、可用的对象域来映射到数据库中的内容,而不是需要进一步操作才能将其制成可用业务对象的哑结构。如果您希望能够明智地编写对象查询,您也将需要它们。

写起来好多了:

Select roles from UserRoles roles where role.user.isAdmin = true

Select roles from UserRules roles join Users u on roles.userName = u.userName where u.isAdmin = true

根据您的显示技术,视图绑定具有真实的对象关系也很有帮助。

请注意,您的自动生成工具创建的属性名称也是任意的。没有要求它们与列名匹配。

public User getUserName()实际上是相当愚蠢的。
您当然可以将其更改为public User getUser()

于 2010-05-27T22:46:33.273 回答
1

首先,根据规范,实体必须具有公共或受保护的无参数构造函数。它可能有其他构造函数,但 JPA 并不关心它们,所以只要您提供无参数构造函数,就可以随意添加您想要/需要的任何内容。

其次,在使用 ORM 时,您需要“忘记列和外键”并考虑对象和关联,ORM 会为您处理外键和连接。

所以我实际上希望看到这样的东西:

@JoinColumn(name = "UserName", referencedColumnName = "UserName")
@ManyToOne(optional = false)
private User user;
@JoinColumn(name = "DatasetNo", referencedColumnName = "DatasetNo")
@ManyToOne(optional = false)
private Dataset dataset;

区别是微妙的(erf,技术上没有区别),但在它所传达的内容上是基本的:实体的属性不是外键,而是其他实体的实例(因此是思考对象和关联)。

使用 JPQL 编写查询时也是如此。您需要思考对象并在关联中导航。例如,要在 JPQL 中检索给定userNameUsera ......好吧,让我们在这里调用Foo实体持有UserDataset

select f.user.userName from Foo f where f.id = :id
于 2010-05-27T23:09:30.263 回答