在持久实体中使用Java构造函数

在持久实体中使用Java构造函数,java,class,persistence,instances,Java,Class,Persistence,Instances,我是JPA新手,在Java中使用持久性,我有两个问题不能完全解决:我已经生成了如下标记: @JoinColumn(name = "UserName", referencedColumnName = "UserName") @ManyToOne(optional = false) private User userName; @JoinColumn(name = "DatasetNo", referencedColumnName = "DatasetNo") @ManyToOne(optional

我是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列都是实体可视化上的“外键”,对应于同名的数据库表。我不太懂ORM

当使用实体类或POJO时,是否最好使用如下类变量:

私人用户用户名

其中指定了类的实例,或仅指定该类实例的键,如:

私有字符串用户名

谢谢


摩根先生。

构造函数的编写方式只是用于从模式创建类的自动生成工具的一个特性。如果你想要一个能接受它们的构造函数,可以随意添加它。需要知道您使用的是哪一个,以及它是如何配置的,以便对其工作原理进行评论:)

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

这样写会更好:

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

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

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

公共用户getUserName()
实际上相当愚蠢。

您当然可以将其更改为
public User getUser()

首先,根据规范,一个实体必须具有一个公共或受保护的无参数构造函数。它可能有其他构造函数,但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,在技术上没有区别),但在它的通信方式上是基本的:实体的属性不是外键,而是其他实体的实例(因此是think对象和关联)

当使用JPQL编写查询时,同样适用。您需要思考对象并在关联中导航。例如,要在JPQL中检索给定用户的
用户名
。。。那么,让我们在这里调用持有
User
Dataset
的实体
Foo

select f.user.userName from Foo f where f.id = :id

谢谢你的回答。我很乐意保留对象引用,即私有数据集;但是我可能会使用POJO而不是JPA标签,即使这意味着我必须自己编写一些ORM——我以前在JPA方面运气不好。这是一个总共包含20个核心表的小系统,因此使用准备好的语句手工编写ORM代码不会是一项繁重的任务。其他系统表将使用不同数量的属性动态创建,因此无论如何都不可能对这些表使用JPA。
select f.user.userName from Foo f where f.id = :id