How to make an Entity read-only?

后端 未结 9 1149
情歌与酒
情歌与酒 2020-12-03 00:43

What is the proper way to make an Entity read-only with JPA ? I wish my database table to never be modified at all programmatically.

I think I understand that I sho

相关标签:
9条回答
  • 2020-12-03 00:47

    If you are using spring-data or are otherwise using the Repository pattern, don't include any save / update / create / insert / etc methods in the Repository for that particular entity. This can be generalized by having a base class / interface for readonly entities, and an updatable one that extends the readonly one for updatable entities. As other posters have pointed out, the setters may also be made non-public to avoid developers accidentally setting values that they are then unable to save.

    0 讨论(0)
  • 2020-12-03 00:49

    Hibernate also has a org.hibernate.annotations.Immutable annotation that you can put on the type, method, or field.

    0 讨论(0)
  • 2020-12-03 00:50

    In your entity add an EntityListener like this:

    @Entity
    @EntityListeners(PreventAnyUpdate.class)
    public class YourEntity {
        // ...
    }
    

    Implement your EntityListener, to throw an exception if any update occurs:

    public class PreventAnyUpdate {
    
        @PrePersist
        void onPrePersist(Object o) {
            throw new IllegalStateException("JPA is trying to persist an entity of type " + (o == null ? "null" : o.getClass()));
        }
    
        @PreUpdate
        void onPreUpdate(Object o) {
            throw new IllegalStateException("JPA is trying to update an entity of type " + (o == null ? "null" : o.getClass()));
        }
    
        @PreRemove
        void onPreRemove(Object o) {
            throw new IllegalStateException("JPA is trying to remove an entity of type " + (o == null ? "null" : o.getClass()));
        }
    }
    

    This will create a bullet proof safety net for your entity with JPA lifecycle listeners.

    • PRO: JPA standard - not hibernate specific
    • PRO: very safe
    • CON: only shows write attempts at runtime. If you want a compile time check, you should not implement setters.
    0 讨论(0)
  • 2020-12-03 00:59

    Eclipselink implementation also offers you the @ReadOnly annotation at the entity level

    0 讨论(0)
  • 2020-12-03 01:00

    A solution is to use field based annotation, to declare your fields as protected and to propose only public getter. Doing so, your objects can not be altered.

    (This solution is not entity specific, it is just a way to build immutable objects)

    0 讨论(0)
  • 2020-12-03 01:00

    If your JPA implementation is hibernate - you could use the hibernate Entity annotation

    @org.hibernate.annotations.Entity(mutable = false)
    

    Obviously this will tie your model to hibernate though.

    0 讨论(0)
提交回复
热议问题