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

时间:2010-05-27 22:32:23

标签: java class persistence instances

我是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时,最好有类变量,如:

私人用户userName;

指定类的实例或只是该类实例的键,如:

private String userName;

由于

摩根先生。

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分: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中检索给定的userName的{​​{1}},请致电User此处持有FooUser的实体:

Dataset