【问题标题】:Use of Java constructors in persistent entities在持久实体中使用 Java 构造函数
【发布时间】:2010-05-27 22:32:22
【问题描述】:

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

私人用户用户名;

在哪里指定了一个类的实例,或者只是该类实例的键,例如:

私有字符串用户名;

谢谢

摩根先生。

【问题讨论】:

    标签: java class persistence instances


    【解决方案1】:

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

    通常最好映射实际的对象关系。毕竟这就是 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()

    【讨论】:

    • 感谢您的回答。我很高兴保留对象引用,即私有数据集数据集;但是我可能会使用 POJO 而不是 JPA 标签,即使这意味着我必须自己编写一些 ORM——我以前在 JPA 上运气不好。它是一个包含大约 20 个核心表的小型系统,因此使用准备好的语句手写 ORM 代码不会是一项繁重的任务。其他系统表将使用不同数量的属性动态创建,因此无论如何都无法使用 JPA。
    【解决方案2】:

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

    这同样适用于使用 JPQL 编写查询。您需要思考对象并在关联中导航。例如,要在 JPQL 中检索给定的 UseruserName... 好吧,让我们在此处调用 Foo 持有 UserDataset 的实体:

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

    【讨论】:

      猜你喜欢
      • 2014-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-24
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      相关资源
      最近更新 更多