我有一个抽象的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);
建立关系的方式与继承策略无关。因此,您的@manytomany
关系的定义与关联的@jointable
定义应该与所有可用的策略一起工作-single_table
、jointed
和table_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(尽管我认为这可能与所提出的设计问题无关)。 有兴趣看看人们的意见是什么。 谢谢。戴夫 问题答案: 映射表绝对是执行此操作的最佳方法-实体框架会将映射表转换为两侧的实体集合,并且