Переопределение унаследованных свойств (таких как имя таблицы унаследованных связей, имена столбцов … и т.д.) @MappedSuperclass в сущности подкласса

#java #spring #hibernate #spring-data-jpa #hibernate-mapping

#java #spring #спящий режим #spring-data-jpa #отображение в спящий режим

Вопрос:

Это мой абстрактный отец:

 @MappedSuperclass
public class AbstractEntity{

  @ManyToMany
  protected Set<UserGroupAccess> userGroupAccesses = new HashSet<>();
  
  @ManyToMany
  protected Set<UserAccess> userAccesses = new HashSet<>();

}
  

это две сущности, которые наследуют абстрактность, указанную выше:

 @Entity
public class Project extends AbstractEntity{
    // some other properties
}

@Entity
public class TodoTask extends AbstractEntity{
    // some other properties
}
  

Я хочу, чтобы в каждом объекте подкласса переопределялась и была своя таблица отношений, представленная userGroupAccesses и userAccesses, я имею в виду, например, для объекта Project, мне нужно, чтобы у него была своя таблица projectuserGroupAccesses и таблица projectuserAccesses, представляющая отношения, определенные в суперклассе AbstractEntity.

Ранее мне удавалось решить такую проблему, используя XML-представление сущностей, я просто определяю следующее в каждой сущности XML:

 <set name="userGroupAccesses" table="projectusergroupaccesses" cascade="all-delete-orphan">
      <cache usage="read-write" />
      <key column="projectid" />
      <many-to-many class="org.hisp.dhis.user.UserGroupAccess" column="usergroupaccessid" unique="true" />
    </set>

    <set name="userAccesses" table="projectuseraccesses" cascade="all-delete-orphan">
      <cache usage="read-write" />
      <key column="projectid" />
      <many-to-many class="org.hisp.dhis.user.UserAccess" column="useraccessid" unique="true" />
    </set> 
  

Но я все еще не уверен, как это сделать в аннотированном представлении сущности.
Я прочитал о @AssociationOverrides и @JoinTable, я знаю, что они мне нужны для решения моей проблемы, но я все еще не мог разобраться в них.

Кто-нибудь может помочь объяснить, как правильно использовать @AssociationOverrides и @JoinTable, используя мой случай в качестве примера?

Ответ №1:

Наконец, мне удалось узнать, как это делается. Способ, которым мы используем @AssociationOverrides и @JoinTable в моем случае использования для переопределения отношения, определенного родителями, заключается в следующем:

 // Parent class
@MappedSuperclass
public class AbstractEntity{

  @Id
  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
  @SequenceGenerator(name = "sequenceGenerator")
  protected Long id; // I need to override the column name in child entities.

  @ManyToMany
  protected Set<UserGroupAccess> userGroupAccesses = new HashSet<>(); // I need to override Table name in child entities.
  
  @ManyToMany
  protected Set<UserAccess> userAccesses = new HashSet<>(); // I need to override Table name in child entities.

}
  

и дочерние объекты, которые мне нужны, чтобы изменить их следующим образом:

 // First Child Entity
@Entity
@AttributeOverride(name = "id", column = @Column(name = "projectid"))
@AssociationOverride(
    name="userGroupAccesses",
    joinTable=@JoinTable(
        name="projectusergroupaccesses",
        joinColumns=@JoinColumn(name="projectid"),
        inverseJoinColumns=@JoinColumn(name="usergroupaccessid")
    )
)
@AssociationOverride(
    name="userAccesses",
    joinTable=@JoinTable(
        name="projectuseraccesses",
        joinColumns=@JoinColumn(name="projectid"),
        inverseJoinColumns=@JoinColumn(name="useraccessid")
    )
)
public class Project extends AbstractEntity {
    // some other properties
}

/////////////////////////
// Second Child Entity

@Entity
@AttributeOverride(name = "id", column = @Column(name = "todotaskid"))
@AssociationOverride(
    name="userGroupAccesses",
    joinTable=@JoinTable(
        name="todotaskusergroupaccesses",
        joinColumns=@JoinColumn(name="todotaskid"),
        inverseJoinColumns=@JoinColumn(name="usergroupaccessid")
    )
)
@AssociationOverride(
    name="userAccesses",
    joinTable=@JoinTable(
        name="todotaskuseraccesses",
        joinColumns=@JoinColumn(name="todotaskid"),
        inverseJoinColumns=@JoinColumn(name="useraccessid")
    )
)
public class TodoTask extends AbstractEntity {
    // some other properties
}
  

Комментарии:

1. Иногда вам везет, и кто-то публикует именно тот пример, который вы ищете. Спасибо за добавление ответа.

2. @end-user 🙂