首页 文章

是否可以在Hibernate / JPA中使用不可变字段?

提问于
浏览
16

在我们的应用程序中,我们需要只能分配一次的字段 .

起初我们考虑封装字段并使setter私有化 . 但是,有些问题会引起:

  • 如果没有公共设置器,Hibernate是否仍能从数据库中映射字段?

  • 我可以剥离setter并仅在实体构造函数中使字段可变吗?

  • 最后,是否有任何标准的JPA方法使字段不可变?

提前致谢 .

5 回答

  • 2
    • 广告1:我认为如果注释放在字段上而不是放在getter上,JPA会使用普通的私有字段进行读取和写入 . 最近我发现Hibernate作为底层JPA提供者根本不需要 get*()set*() 方法 . 这是一个真正具有启发性的解决方案,因为从一开始我就认为Hibernate需要访问器 . 所以答案是: you don't need setters 就Hibernate而言 .

    • 广告2:但是请注意,Hibernate仍然需要no-arg构造函数,否则它将无法加载具有描述性异常的实体 . 这也是JPA的要求 .

    • 广告3:不,没有 . 请记住,您的馆藏也必须是不可变的 .

  • 9

    尝试

    @Column(updatable = false)
    

    并使你的二传手私人 . (如果你愿意,可以公开你的获取者)

    我认为这是最好的做法 .

    P.S . :JPA使用字段访问,如果您注释您的字段并使用getter / setter访问,如果您注释您的getter方法 .

  • 1

    在JPA 2.0中,您有两种方法可以定义应该保留哪些属性:

    • Access(FIELD) - 字段名称是持久的,

    • Access(PROPERTY) - 属性名称是持久的 .

    如果没有使用Access( - )注释,则决定使用哪种访问权限取决于您放置@Id注释的位置 . 如果将它放在您的字段旁边 - 将使用Access(FIELD) . 如果将它放在访问者旁边 - 将使用Access(PROPERTY) .

    因此,如果使用Access(FIELD),则不必为特定字段提供适当的JavaBeans样式访问器 . 您可以拥有一个名为“myField”的私有字段和一个名为“public setBlahBlah( - )”的公共setter . JPA将仅保留'myField' .

  • 15

    尝试

    @Column(updatable = false)
    

    来自javadoc:

    该列是否包含在由持久性提供程序生成的SQL UPDATE语句中 .

  • 3

    您可以使用 @Entity(mutable=false)@Immutable 注释为框架标记实体,以利用此事实来提高缓存等性能 . (休眠)

    然后你可以使用这样的不可变包装类:

    public class ImmutableStuff {
        private final FooField barValue;
    
        public ImmutableStuff(Stuff stuff) {
            barValue = stuff.barValue;
        }
    
        public FooField getBarValue(){
            return barValue;
        }
    }
    

相关问题