Define customized superclass

Hi,

Can i create a custom superclass for all entities?

Example
Before

public class Customer extends StandardEntity

After
Define superclass

public class MyStandarEntity extends StandardEntity

and

public class Customer extends MyStandarEntity 

I have the following error:
java.lang.IllegalStateException: Entity com.company.sales.entity.Customer has no attribute applicable for table id column

Hi Francesco,

Sure, you can define your own superclass. You should annotate it as


@MappedSuperclass

or just select MappedSuperclass checkbox in Enity editor in CUBA Studio.

According to the documentation, it ‘defines that the class is an ancestor for some entities and its attributes must be used as part of descendant entities. Such class is not associated with any particular database table’.

See an example in the attachment.

Regards,
Aleksey

CustomSuperclass.zip (25.6K)

I forgot to edit persistence.xml. Now works.
Thanks.

Another question.
I would like set Field1 ( the field is not in DB ) during instantiation of MyStandardEntity object.
In my applications Spring based , I do this in the rowMapper .
How should I do it in Cuba?

thanks again

Francesco,

If you don’t want a property to be stored in the DB, add @Transient annotation to it:


    @Transient
    @MetaProperty
    protected String field1;

Regarding property initialization ‘during instantiation’, I’m not quite sure what you mean here.

  1. If the question is about new instance creation you can simply add initialization logic to the constructor:

@MappedSuperclass
public class MyStandardEntity extends StandardEntity {
    private static final long serialVersionUID = 7505674951206475460L;

    @Transient
    @MetaProperty
    protected String field1;
   ...
    public MyStandardEntity() {
        this.field1 = UUID.randomUUID().toString();;
    }
   ...
}
  1. If you mean initialization on reading entity from DB, just create before detach entity listener:

@Component("customsuperclass_MyStandardEntityListener")
public class MyStandardEntityListener implements BeforeDetachEntityListener<MyStandardEntity> {
    @Override
    public void onBeforeDetach(MyStandardEntity entity, EntityManager entityManager) {
        entity.setField1(UUID.randomUUID().toString());
    }
}

Documentation on entity listeners can be found here.

Also, it would be helpful to have a look at the ‘Assigning Initial Values’ section of the documentation.

Regards,
Aleksey