gpt4 book ai didi

java - 使用 @MappedSuperclass 注释的 Hibernate 实体多态性

转载 作者:行者123 更新时间:2023-12-01 12:46:54 29 4
gpt4 key购买 nike

考虑以下模型:

抽象类AbstractLog

@MappedSuperclass
public abstract class AbstractLog{

private Long id;
private Set<Comment> comments;

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "quasar_log_id_seq")
public Long getId() {
return id;
}

@OrderBy(clause = "created")
@OneToMany(mappedBy = "abstractLog", fetch = FetchType.LAZY, cascade = { CascadeType.ALL }, orphanRemoval = true)
public Set<Comment> getComments() {
return comments;
}

// setters
}

审核日志

@Entity
@SequenceGenerator(name = "quasar_log_id_seq", sequenceName = "quasar_log_id_seq")
public class AuditLog extends AbstractLog {

private Set<AuditLogItem> items;

@OrderBy(clause = "date")
@OneToMany(mappedBy = "auditLog")
public Set<AuditLogItem> getItems() {
return items;
}
}

文档日志

@Entity
@SequenceGenerator(name = "quasar_log_id_seq", sequenceName = "quasar_log_id_seq")
public class DocumentationLog extends AbstractLog {

private Set<DocumentationLogItem> items;

@OrderBy(clause = "date")
@OneToMany(mappedBy = "documentationLog")
public Set<DocumentationLogItem> getItems() {
return items;
}

}

评论

@Entity
@SequenceGenerator(name = "quasar_comment_id_seq", sequenceName = "quasar_comment_id_seq", initialValue = 1, allocationSize =1)
@Table(name = "quasar_comment")
public class Comment extends IdentifiableEntity {

private User user;
private String comment;
private AbstractLog abstractLog;

@Id
@Override
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "quasar_comment_id_seq")
public Long getId() {
return super.getId();
}

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "id_user")
public User getUser() {
return user;
}

@Column(name = "comment", length = 300)
public String getComment() {
return comment;
}


@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "audit_log_id", nullable = false)
public AbstractLog getAbstractLog() {
return abstractLog;
}

}

您会注意到,ID 序列生成器对于 AbstractLog 的所有扩展实体都是相同的。

目的是,实体CommentAbstractLog的所有扩展实体之间共享。是否可以使用注释@MappedSuperclass?如果我使用@Inheritance注释,AbstractLog类也会被创建,但我不希望这样。当前抛出引用未知实体错误。

最佳答案

@MappedSuperclass 用于继承属性,但因为它不代表实体,所以您可以使用实体关系,因此您只剩下基本类型、id 生成和乐观锁定版本。

如果您不希望基类成为它自己的表(例如每个子类一个表),则可以使用每个具体类一个表策略。每个实体都有自己的表,继承的属性只是 Java 的便利,因为它们将在每个 SQL 表中重复。

因此您可以将 @MappedSuperclass 替换为:

@Inheritance(InheritanceType.TABLE_PER_CLASS)

但是根据Java Persistence wiki :

Single table inheritance is the default, and table per class is an optional feature of the JPA spec, so not all providers may support it.

Hibernate 支持它,但如果您计划使用其他 JPA 提供程序,您可能不支持它。

关于java - 使用 @MappedSuperclass 注释的 Hibernate 实体多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24609533/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com