#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 🙂