Skip to content

Virtual Fields (@Transient)

Fields annotated with JPA @Transient will not generate a database column at startup — they are purely a UI display mechanism. Use DataProxy to populate or consume virtual field values.

Virtual Columns

Display a non-database field in the table and populate its value via DataProxy.afterFetch:

java
@Erupt(name = "Virtual Column", dataProxy = VirtualDemo.class)
@Table(name = "virtual_demo")
@Entity
public class VirtualDemo extends BaseModel implements DataProxy<VirtualDemo> {

    // Text input
    @EruptField(
            views = @View(title = "Text"),
            edit = @Edit(title = "Text")
    )
    private String field;
    
    
    @Transient
    @EruptField(
        views = @View(title = "Virtual Column (non-database field)")
    )
    private String virtualColumn;
    
    @Override
    public void afterFetch(Collection<Map<String, Object>> list) {
        for (Map<String, Object> map : list) {
            map.put("virtualColumn", "Custom virtual column value");
        }
    }
    
}

Virtual Form Fields

Show a non-database field in the form and consume its value in DataProxy after submission:

java
@Erupt(name = "Virtual Form", dataProxy = VirtualDemo.class)
@Table(name = "virtual_demo")
@Entity
@Setter
public class VirtualDemo extends BaseModel implements DataProxy<VirtualDemo> {

    @EruptField(
            views = @View(title = "Text"),
            edit = @Edit(title = "Text")
    )
    private String text;
    
    
    @Transient
    @EruptField(
        edit = @Edit(title = "Virtual Form Field")
    )
    private String virtualForm;

    
    @Override
    public void afterAdd(VirtualDemo virtualDemo) {
        // Combine the virtual field value into the persisted field on add
        this.text = this.text + this.virtualForm;
    }
    
}

Contributors

The avatar of contributor named as YuePeng YuePeng
The avatar of contributor named as Claude Opus 5 (1M context) Claude Opus 5 (1M context)

Changelog

Released under the Apache-2.0 License.