覆盖子类实体中 @MappedSuperclass 的继承属性(例如继承关系 table 名称、列名称...等)
Override inherited properties (such as inherited relationships table name, columns names...etc) of a @MappedSuperclass in the subclass entity
这是我抽象的父亲:
@MappedSuperclass
public class AbstractEntity{
@ManyToMany
protected Set<UserGroupAccess> userGroupAccesses = new HashSet<>();
@ManyToMany
protected Set<UserAccess> userAccesses = new HashSet<>();
}
这两个实体继承了上面的 AbstractEntity:
@Entity
public class Project extends AbstractEntity{
// some other properties
}
@Entity
public class TodoTask extends AbstractEntity{
// some other properties
}
我希望在每个子类实体中重写并具有其 table 由 userGroupAccesses 和 userAccesses 表示的关系,我的意思是例如 Project 实体我需要它有自己的 table projectuserGroupAccesses 和 table 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>
但我仍然不确定如何在 Entity 的 Annotation 表示中做到这一点。
我已经阅读了 @AssociationOverrides 和 @JoinTable 我知道他们是我需要解决我的问题的人,但我仍然无法得到我的头围着他们。
谁能以我的案例为例,帮助解释如何正确使用 @AssociationOverrides 和 @JoinTable?
终于知道是怎么做到的了。
我们在我的用例中使用 @AssociationOverrides 和 @JoinTable 来覆盖 parent-defined 关系的方式如下:
// 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
}
这是我抽象的父亲:
@MappedSuperclass
public class AbstractEntity{
@ManyToMany
protected Set<UserGroupAccess> userGroupAccesses = new HashSet<>();
@ManyToMany
protected Set<UserAccess> userAccesses = new HashSet<>();
}
这两个实体继承了上面的 AbstractEntity:
@Entity
public class Project extends AbstractEntity{
// some other properties
}
@Entity
public class TodoTask extends AbstractEntity{
// some other properties
}
我希望在每个子类实体中重写并具有其 table 由 userGroupAccesses 和 userAccesses 表示的关系,我的意思是例如 Project 实体我需要它有自己的 table projectuserGroupAccesses 和 table 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>
但我仍然不确定如何在 Entity 的 Annotation 表示中做到这一点。 我已经阅读了 @AssociationOverrides 和 @JoinTable 我知道他们是我需要解决我的问题的人,但我仍然无法得到我的头围着他们。
谁能以我的案例为例,帮助解释如何正确使用 @AssociationOverrides 和 @JoinTable?
终于知道是怎么做到的了。 我们在我的用例中使用 @AssociationOverrides 和 @JoinTable 来覆盖 parent-defined 关系的方式如下:
// 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
}