简体   繁体   中英

@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?

@MappedSupperclass is different than the @Inheritance annotation.

@MappedSuperclass tells the JPA provider to include the base class persistent properties as if they were declared by the child class extending the superclass annotated with @MappedSuperclass .

However, the inheritance is only visible in the OOP world, since, from a database perspective, there's no indication of the base class. Only the child class entity will have an associated mapped table.

The @Inheritance annotation is meant to materialize the OOP inheritance model in the database table structure. More, you can query a base class annotated with @Inheritance but you can't do that for a base class annotated with @MappedSuperclass .

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...

Sometimes to inherit child class we create a parent class but we don't use it as a table.Inheriting that parent class we create various table.That's why we don't use @Entity in a parent class. Rather than we use @MappedSuperClass in a parent or super class.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM