【发布时间】:2020-11-21 08:38:22
【问题描述】:
假设我至少有两个实体。
@Entity
public class Process {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(unique = true)
private String name;
@ManyToAny(
metaColumn = @Column(name = "node_type"),
fetch = FetchType.LAZY
)
@AnyMetaDef(
idType = "long", metaType = "string",
metaValues = {
@MetaValue(targetEntity = Milestone.class, value = MILESTONE_DISC),
@MetaValue(targetEntity = Phase.class, value = PHASE_DISC)
}
)
@Cascade({org.hibernate.annotations.CascadeType.ALL})
@JoinTable(
name = "process_nodes",
joinColumns = @JoinColumn(name = "process_id", nullable = false),
inverseJoinColumns = @JoinColumn(name = "node_id", nullable = false)
)
private Collection<ProcessNode> nodes = new ArrayList<>();
...
}
@Entity
@ToString
@DiscriminatorValue(MILESTONE_DISC)
public class Milestone implements ProcessNode {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private Collection<ResultDefinition> results;
@ManyToOne()
private Process process;
...
}
当我尝试创建进程时,会执行以下操作:
插入里程碑(id、名称、流程)值(null、?、?)
如何映射@ManyToOne 属性,即流程不是插入里程碑表而是通过与process_nodes 表连接获得的?
编辑:
我现在做了以下事情:
@ManyToOne(fetch = FetchType.LAZY)
@Transient
private Process process;
我可以从里程碑访问流程,但流程未保存在里程碑表中。
有没有更简洁的方法来实现这一目标?
第二次修改
更多细节:
ProcessNode 是其他两个实体继承自的接口。使用休眠注释@ManyToAny,我将其映射到以下结构中:
【问题讨论】:
标签: java hibernate spring-data-jpa