如何使实体内的属性成为只读?

时间:2014-11-03 07:02:40

标签: java hibernate jpa orm

我在实体内部拥有此属性(即集合)。它是通过与另一个表执行JoinTable而形成的。是否可以通过其他服务/客户端/视图/等对此属性执行任何更新。不保存到数据库中?

换句话说,我只是想从数据库中提取这个属性,但我不想将其更新的状态保存回来。原因是我有另一种方法来更新数据库中的这些列,这应该是更新此列的官方方式,然后我可以再次使用此属性读取更新的值。

编辑:这是一些代码

Class Person:

@JoinTable(name="PERSON_DEPENDENCY",  
             joinColumns = @JoinColumn(name = "parent_id")  
             inverseJoinColumns = @JoinColumn(name = "child_id"))  
Set<Person> children;

属性父项还有另一个类似的注释(只是从上面的注释交换了parent_id和child_id)。如果A是B的父级,保存A的孩子将会产生一行,其中parent_id = A的id为child_id = B ...同时保存B的父母也会产生相同的结果行。理想情况下,我只想保存这些集合中的一个,这应该足够了,但同时加载两者以快速了解一个人的父母/子女。

4 个答案:

答案 0 :(得分:1)

设置&#34;可插入&#34;和&#34;可更新&#34;该字段的@Column注释的属性为&#34; false&#34;。

答案 1 :(得分:0)

解决方案是使用基于字段的注释,将您的字段声明为受保护并仅建议公共getter。这样做,您的对象无法更改。

(此解决方案不是特定于实体的,它只是一种构建不可变对象的方法)

答案 2 :(得分:-1)

将字段标记为@Transient。不保存或从数据库中读取瞬态字段。

答案 3 :(得分:-1)

瞬态场 瞬态实体字段是不参与持久性的字段,它们的值永远不会存储在数据库中(类似于Java中不参与序列化的瞬态字段)。静态和最终实体字段始终被视为瞬态。其他字段可以使用Java transient修饰符(也影响序列化)或JPA @Transient注释(仅影响持久性)显式声明为瞬态:

@Entity
public class EntityWithTransientFields {
    static int transient1; // not persistent because of static
    final int transient2 = 0;  // not persistent because of final
    transient int transient3; // not persistent because of transient
    @Transient int transient4; // not persistent because of @Transient
}

上述实体类仅包含瞬态(非持久)实体字段,没有真实内容存储在数据库中。