Search code examples
javahibernatejpainheritanceorm

@MappedSuperclass is not an @Entity in JPA?


So I am using DerbyDB and I am setting up some entities. I have a @MappedSuperclass which is used as a superclass for some entities (@Entity). More specifically, I have a superclass User and 3 subclasses namely admin, regular and guest. Now I have a different entity, let's say file that should reference (as one of its fields) its owner. So I created a field called User owner. The error I get is:

Exception Description: [File] uses a non-entity [User] as target entity in the relationship attribute [field owner].

Is there a workaround?


Solution

  • I can suggest two solutions:

    Change Inheritance

    The exception you get clearly describes your problem: User is not an entity. Any class declared as superclass with the interface @MappedSuperclass cannot be an entity (in standard JPA - depends on your JPA-provider)... let me point you to an answer I just gave to quite a similar problem

    --> Superclass-Types

    So defining your superclass as an abstract entity will give you the desired behaviour, you described.

    Extra:

    If you choose your inheritance mapping strategy as @Inheritance(strategy = InheritanceType.SINGLE_TABLE) you don't even need multiple database-tables. Here is a good example: JPA Single-Table Inheritance

    Change Model (suggested)

    Don't split your user entity in several entities just by their roles. Make an Enum with all your desired roles and add it as a field to your User-entity. This is widely more common, unless u need your admin, guests etc to be an own object...