两者之间的 JPA 关系 类
JPA relation between two classes
我的任务是构建包含 header 和行的文档。
例如,包含 header(日期、股票)和行(material、数量、价格、总和)的股票收入文档。我的问题是我不确定我的类架构是否正确。代码在这里(JPA + Hibernate):
@Entity
@Table
public class Document extends BaseEntity {
@Column
@Temporal(TemporalType.DATE)
private Date date;
@Column
@Temporal(TemporalType.DATE)
private Date createDate;
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private Set<DocumentRow> rows;
...
}
public class DocumentRow extends BaseEntity {
@ManyToOne(optional = false, cascade = CascadeType.ALL)
private Document document;
@Column(nullable = false, unique = true)
private Integer row;
...
}
@MappedSuperclass
public abstract class BaseEntity implements Serializable {
private static final long serialVersionUID = 8171308450531596347L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id; ...}
你正在做一个双向映射,你不能组合 @ManyToOne
和 @ManyToMany
,尽管你应用的逻辑,sql
是不正确的,因为:
@ManyToMany
将导致关联 Table
ManyToOne
只是另一个实体上父实体的外键。
如果 DocumentRow
元素可以在两个不同的 Document
之间共享,那么您需要一个 ManyToMany
关系,这将导致创建一个连接 Table 并且您必须如果您想要双向关系,请在 DocumentRow
Table 上更改 @ManyToOne
:
@ManyToMany
private List<Document> documents;
如果不是这种情况并且 DocumentRow
只属于一个文档,那么您需要更改父 class 上的映射,即 Document
来自 [=13] =] 到 @OneToMany
这样:
@Entity
@Table
public class Document extends BaseEntity {
@Column
@Temporal(TemporalType.DATE)
private Date date;
@Column
@Temporal(TemporalType.DATE)
private Date createDate;
@OneToMany(mappedBy="document",...)
private Set<DocumentRow> rows;
...
}
我的任务是构建包含 header 和行的文档。 例如,包含 header(日期、股票)和行(material、数量、价格、总和)的股票收入文档。我的问题是我不确定我的类架构是否正确。代码在这里(JPA + Hibernate):
@Entity
@Table
public class Document extends BaseEntity {
@Column
@Temporal(TemporalType.DATE)
private Date date;
@Column
@Temporal(TemporalType.DATE)
private Date createDate;
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private Set<DocumentRow> rows;
...
}
public class DocumentRow extends BaseEntity {
@ManyToOne(optional = false, cascade = CascadeType.ALL)
private Document document;
@Column(nullable = false, unique = true)
private Integer row;
...
}
@MappedSuperclass
public abstract class BaseEntity implements Serializable {
private static final long serialVersionUID = 8171308450531596347L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id; ...}
你正在做一个双向映射,你不能组合 @ManyToOne
和 @ManyToMany
,尽管你应用的逻辑,sql
是不正确的,因为:
@ManyToMany
将导致关联 Table
ManyToOne
只是另一个实体上父实体的外键。
如果 DocumentRow
元素可以在两个不同的 Document
之间共享,那么您需要一个 ManyToMany
关系,这将导致创建一个连接 Table 并且您必须如果您想要双向关系,请在 DocumentRow
Table 上更改 @ManyToOne
:
@ManyToMany
private List<Document> documents;
如果不是这种情况并且 DocumentRow
只属于一个文档,那么您需要更改父 class 上的映射,即 Document
来自 [=13] =] 到 @OneToMany
这样:
@Entity
@Table
public class Document extends BaseEntity {
@Column
@Temporal(TemporalType.DATE)
private Date date;
@Column
@Temporal(TemporalType.DATE)
private Date createDate;
@OneToMany(mappedBy="document",...)
private Set<DocumentRow> rows;
...
}