繁体   English   中英

为什么spring数据JPA中的关系属性不能也final呢?

[英]Why can't we make a relationship attribute in spring data JPA final as well?

Owner 实体与 teacher 实体具有@ManyToOne - @OneToMany关系。 当我这样注释每个时

@Entity
public class Product {

... 

@ManyToOne(cascade = MERGE)
private final Owner owner;

另一方面,在所有者 Class 中,

@Entity 
public class Owner {

...

@OneToMany(mappedBy = "owner", cascade = MERGE)
private final List<Product> products;

现在发生的是mappedBy = "owner" "owner"红色。 将鼠标悬停在它上面,我收到无法找到所有者属性的错误。

错误:找不到反向属性

解决方案是简单地删除产品 class 中属性所有者中的final关键字。

它成为private Owner owner ,错误消失。 我不明白为什么添加关键字final会导致此问题。

为什么会这样? 有解决方法吗? 我还能将 owner 属性设置为最终属性吗?

getgo 的主要想法是使产品 class 不可变。 虽然这是一个挑战,但我已经设法找到了大多数事情的解决方法,但我不知道如何解决这个问题。

JPA 不支持不变性。 JPA 实体确实需要默认构造函数以及属性的 getter 和 setter。 并且这些字段不能是最终的。

从技术上讲,可以实现忽略最终属性的 ORM,但为什么要这样做呢?

关键字 final 表示:这在构造时被分配了一个值,之后永远不会改变。 对于通过 no-args-constructor 构建然后在第二步填充的 JPA 实体来说,这是不正确的。

如果您正在寻找更好地支持不可变类的 ORM(具有 arguments 的构造函数,“枯萎”方法),您可能需要查看 Spring 数据 JDBC。

全面披露:我是 Spring 数据开发人员,负责 Spring 数据 JPA 和 Spring 数据 JDBC。

我认为您错误地理解了不变性概念。 不变性是 Java 语言强加的一个概念。 例如 String class 由于安全性、缓存等原因是不可变的。但在您的情况下, Product 是一个实体 class 并且如果您将它保存在持久层中,它本身已经是唯一的。 因此,即使您使产品 class 不可变,您将如何在两次应用程序加载期间保持这种一致性? 如果您试图使产品仅由一个所有者拥有,那么请进行数据库检查,而不是尝试使其在 memory 中不可变。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM