How to set a default entity property value with Hibernate

后端 未结 17 2207
一整个雨季
一整个雨季 2020-11-28 02:53

How do I set a default value in Hibernate field?

相关标签:
17条回答
  • 2020-11-28 02:59

    One solution is to have your getter check to see if whatever value you are working with is null (or whatever its non-initialized state would be) and if it's equal to that, just return your default value:

    public String getStringValue(){
         return (this.stringValue == null) ? "Default" : stringValue;
    }
    
    0 讨论(0)
  • 2020-11-28 02:59

    Use @ColumnDefault() annotation. This is hibernate only though.

    0 讨论(0)
  • 2020-11-28 03:01

    Suppose we have an entity which contains a sub-entity.

    Using insertable = false, updatable = false on the entity prevents the entity from creating new sub-entities and preceding the default DBMS value. But the problem with this is that we are obliged to always use the default value or if we need the entity to contain another sub-entity that is not the default, we must try to change these annotations at runtime to insertable = true, updatable = true, so it doesn't seem like a good path.

    Inside the sub-entity if it makes more sense to use in all the columns insertable = false, updatable = false so that no more sub-entities are created regardless of the method we use (with @DynamicInsert it would not be necessary)

    Inserting a default value can be done in various ways such as Default entity property value using constructor or setter. Other ways like using JPA with columnDefinition have the drawback that they insert a null by default and the default value of the DBMS does not precede.


    Insert default value using DBMS and optional using Hibernate

    But using @DynamicInsert we avoid sending a null to the db when we want to insert a sub-entity with its default value, and in turn we allow sub-entities with values other than the default to be inserted.

    For inserting, should this entity use dynamic sql generation where only non-null columns get referenced in the prepared sql statement?

    Given the following needs:

    • The entity does not have the responsibility of creating new sub-entities.
    • When inserting an entity, the sub-entity is the one that was defined as default in the DBMS.
    • Possibility of creating an entity with a sub-entity which has a UUID other than the default.

    DBMS: PostgreSQL | Language: Kotlin

    @Entity
    @Table(name = "entity")
    @DynamicInsert
    data class EntityTest(
            @Id @GeneratedValue @Column(name = "entity_uuid") val entityUUID: UUID? = null,
    
            @OneToOne(cascade = [CascadeType.ALL])
            @JoinColumn(name = "subentity_uuid", referencedColumnName = "subentity_uuid")
            var subentityTest: SubentityTest? = null
    ) {}
    
    @Entity
    @Table(name = "subentity")
    data class SubentityTest(
            @Id @GeneratedValue @Column(name = "subentity_uuid", insertable = false, updatable = false) var subentityUUID: UUID? = null,
            @Column(insertable = false, updatable = false) var name: String,
    ) {
            constructor() : this(name = "")
    }
    

    And the value is set by default in the database:

    alter table entity alter column subentity_uuid set default 'd87ee95b-06f1-52ab-83ed-5d882ae400e6'::uuid;
    

    GL

    • Source 1
    • Source 2
    0 讨论(0)
  • 2020-11-28 03:02

    If you want to do it in database:

    Set the default value in database (sql server sample):

    ALTER TABLE [TABLE_NAME] ADD  CONSTRAINT [CONSTRAINT_NAME]  DEFAULT (newid()) FOR [COLUMN_NAME]
    

    Mapping hibernate file:

        <hibernate-mapping ....
        ...    
        <property name="fieldName" column="columnName" type="Guid" access="field" not-null="false"  insert="false" update="false"  />
        ...
    

    See, the key is insert="false" update="false"

    0 讨论(0)
  • 2020-11-28 03:02

    To use default value from any column of table. then you must need to define @DynamicInsert as true or else you just define @DynamicInsert. Because hibernate takes by default as a true. Consider as the given example:

    @AllArgsConstructor
    @Table(name = "core_contact")
    @DynamicInsert
    public class Contact implements Serializable {
    
        @Column(name = "status", columnDefinition = "int default 100")
        private Long status;
    
    }
    
    0 讨论(0)
  • 2020-11-28 03:04

    I searched for this and found many answers to default value for column.If you want to use default value defined in SQL Table then in @Column Annotation use "insertable = false". insertable

    @Column(name = columnName, length = lengthOfColumn, insertable = false)

    If you are using columnDefination it @Column annotation may be it won't work as it is Database dependent.

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