当前位置: 首页 > 知识库问答 >
问题:

JPA-抽象基实体类中的多对多关系和具体扩展实体子类中的联接表引用

公西俊民
2023-03-14

我有一个抽象的BaseEntity类,所有具体的entity类都是从它扩展的。

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class BaseEntity implements Serializable {

    @Column(name = "uid")
    private Long uid;

    /** 
     * The owning side of a ManyToMany relationship from each entity to Tag
     */
    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(name = "baseentity_tag", joinColumns =
    {
        @JoinColumn(name = "baseuid", referencedColumnName = "uid")
    }, inverseJoinColumns =
    {
        @JoinColumn(name = "taguid", referencedColumnName = "uid")
    })
    protected List<Tag> tags = new ArrayList<>();

    public Long getUid() {
        return uid;
    }

    public void setUid(Long uid) {
        this.uid = uid;
    }

    public void setTags(List<Tag> tags) {
        this.tags = tags;
    }

    public List<Tag> getTags() {
        return tags;
    }
}
@Entity
public class Tag extends BaseEntity {

    private static final long serialVersionUID = 1L;

    /** 
     * The inverse side of a ManyToMany relationship from Tag to each entity
     */
    @ManyToMany(mappedBy = "tags", fetch = FetchType.LAZY)
    private List<BaseEntity> baseEntities = new ArrayList<>();   

    public void setBaseEntities(List<BaseEntity> baseEntities) {
        this.baseEntities = baseEntities;
    }

    @XmlTransient
    public List<BaseEntity> getBaseEntities() {
        return baseEntities;
    }          
}

以上设计是否有问题;at线

@JoinColumn(name = "baseuid", referencedColumnName = "uid")

因为我希望连接表“baseentity_tag”(列“baseuid”)在每个具体实体类中都有引用,比如concrete1.java、concrete2.java等?

我想一个通用的连接表“baseEntity_tag”将不能满足所有具体实体的需要。

CREATE TABLE baseentity_tag (baseuid VARCHAR(255) NOT NULL, taguid BIGINT NOT NULL, PRIMARY KEY (baseuid, taguid));
ALTER TABLE baseentity_tag ADD CONSTRAINT FK_baseentity_tag_baseuid FOREIGN KEY (baseuid) REFERENCES conrete1 (uid);
ALTER TABLE baseentity_tag ADD CONSTRAINT FK_baseentity_tag_taguid FOREIGN KEY (taguid) REFERENCES tag (uid);

共有1个答案

松献
2023-03-14

建立关系的方式与继承策略无关。因此,您的@manytomany关系的定义与关联的@jointable定义应该与所有可用的策略一起工作-single_tablejointedtable_per_class,所有这些策略都有不同的表集来支持策略。

在您的示例中,您选择了策略inheritanceType.table_per_class,因此您的每个具体类都有自己的表,其中包括从抽象超级baseEntity继承的字段。这些表中的每一个都包含一个UID列(tableTag)。这些具体类中的每一个都继承@ManyTomany关系,并引用可联合的baseEntity_tag,后者只是根据uid值链接实体。

 类似资料:
  • 问题内容: 我之前了解到抽象类可以扩展具体类。尽管我没从JAVA设计师那里看到原因,但是没关系。我还了解到,扩展具体类的抽象类可以使重写的方法抽象。为什么?您可以提供有用的用例吗?我正在尝试学习设计模式,我不想错过任何东西。 这是示例: 问题答案: 如果我有一组想要默认实现的类(以便它们可以从扩展),并且想要强制提供自己的实现(在这种情况下使其抽象为子类会强制执行此操作。) 当然,此示例中的另一种

  • 我想在我即将完成的一些工作中使用builder模式,它在一个层次结构中有几个类。基类将至少有9个字段要启动,各个子类可能会添加2-4个字段。这会很快失控,而builder模式正是出于这个原因吸引了我。我在书籍和文章中初步接触了builder模式。他们是有帮助的,但没有关于如何扩展这种模式。我试图自己实现这一点,但是我在每个子类的构造函数中遇到了麻烦,因为我不知道如何将构建器中收集的数据传递给超级类

  • 当我们把类看作一种数据类型时,我们通常认定该类型的对象是要被实例化的。但是,在许多情况下,定义不实例化为任何对象的类是很有用处的,这种类称为 抽象类 (abstract class)。因为抽象类要作为基类被其他类继承,所以通常也把它称为 抽象基类(abstract base class)。抽象基类不能用来建立实例化的对象。 抽象类的惟一用途是为其他类提供合适的基类,其他类可从它这里继承和(或)实现

  • 我在各自的字段中使用了@CreatedBy、@CreatedDate、@LastModifiedBy和@LastModifiedDate注释。通过使用@MappdSuperclass、@EntityListeners,我能够持久化上面的列。 但这不适用于以下情况: 审计员我mpl.java JpaAuditConfiguration。Java语言 在这种情况下,实体B填充了审计列。但实体A并非如此

  • 问题内容: 有一个实体类“ A”。A类可能具有相同类型“ A”的子级。如果“ A”是孩子,则也应保留它的父母。 这可能吗?如果是这样,我应该如何在Entity类中映射关系?[“ A”有一个id列。] 问题答案: 是的,这是可能的。这是标准双向@ManyToOne/ @OneToMany关系的特例。之所以特别是因为关系两端的实体都是相同的。JPA 2.0规范的第2.10.2节详细介绍了一般情况。 这

  • 问题内容: 我有两个表: 通常,我会创建一个映射表’ ‘来将这些表链接成多对多关系。 这是最好的方法吗?我应该将s的列表存储在xml列中,而不是存储在“事件”表中吗? 我使用带有Linq的.NET 3.5 / 4作为DAL(尽管我认为这可能与所提出的设计问题无关)。 有兴趣看看人们的意见是什么。 谢谢。戴夫 问题答案: 映射表绝对是执行此操作的最佳方法-实体框架会将映射表转换为两侧的实体集合,并且