基于另外两个实体映射的JPA实体映射

15

不确定是否可能,但正在尝试在下面的实体中基于另外两个实体映射WorkActionClassWorkflowInstance,将与之相关的WorkflowInstancePlayer player映射。

public class Action implements Serializable {
@Id
private Long action_id;

@ManyToOne
@JoinColumn(name = "work_action_class_id", referencedColumnName = "work_action_class_id")
private WorkActionClass workActionClass;

@ManyToOne
@JoinColumn(name = "workflow_instance_id", referencedColumnName = "workflow_instance_id")
private WorkflowInstance workflowInstance;

UPDATE: How can I map to a WorkflowInstancePlayer player?????
 @ManyToOne
 @JoinColumns( {
        @JoinColumn(name = "workflow_instance_id", referencedColumnName = "workflow_instance_id", insertable = false, updatable = false),
        @JoinColumn(name = "workActionClass.role_class_id", referencedColumnName = "role_class_id", insertable = false, updatable = false)
})
 private WorkflowInstancePlayer player;


workflowInstancePlayer是基于workflow_instance_idrole_class_id派生的,但实际上role_class_idworkActionClass的属性,映射在(workActionClass.role_class_id)之上。


public class WorkflowInstancePlayer implements Serializable {
@Id
private WorkflowInstance workflowInstance;

@Id
private RoleClass roleClass;

@ManyToOne
@JoinColumn(name = "badge", referencedColumnName = "badge")
private Employee employee;


public class WorkActionClass implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "trx_seq")
private Long work_action_class_id;

@ManyToOne
@JoinColumn(name = "role_class_id")
private RoleClass roleClass;

示例数据可能如下:

Action
------
Id = 10
work_action_class_id = 7
workflow_instance_id = 2


WorkActionClass
---------------
Id = 7
role_name = reviewer
role_class_id = 3


WorkflowInstancePlayer
----------------------
workflow_instance_id = 2
role_class_id = 3
badge = 111222

因此,在操作实体中,我将知道工作流实例玩家是具有ID 111222的雇员,而无需在操作表中存储徽章。

更新

根据Vlad的帖子,我进行了调整。

@ManyToOne(fetch=FetchType.LAZY)
   @JoinColumnsOrFormulas({
   @JoinColumnOrFormula(formula=@JoinFormula(value="(SELECT a.role_class_id FROM (Use Table Name not Entity Name here) a WHERE a.work_action_class_id = work_action_class_id)", referencedColumnName="role_class_id")),
   @JoinColumnOrFormula(column = @JoinColumn(name="workflow_instance_id", referencedColumnName="workflow_instance_id"))
})

徽章 = 111222 是工作流实例 ID(=2)和角色类别 ID(=3)的某个函数 - 这正确吗?如果不是,那么你是如何得出徽章 = 111222 的呢? - NickJI
不是真的。这是一个工作流应用程序。员工111222被分配为工作流中的审核人。根据工作流类型,审核人将有许多操作。Oracle序列号为2的角色是工作流实例ID的下一个角色,并且Reviewer Role的role_class_id为3。因此,这三个值将被插入WorkflowInstancePlayer。 - jeff
@NickJI,我重新阅读了你的评论。如果你的意思是“函数”作为“关系”,那么是的。起初我把它看成了“公式”,比如instance_id乘以role_class_id除以...等等。这个关系在WorkflowInstancePlayer表中被定义。 - jeff
要访问“Employee”,您需要从“RoleClass”或“WorkflowInstance”出发,然后通过“一对多”的遍历方式到达“WorkflowInstancePlayerId”。但是,没有任何指示哪个是正确的“WorkflowInstancePlayerId”,因此我认为这种方法可能行不通。 - NickJI
你可以像这样拥有...(请参见下一个评论)@Transient private Employee actionOwnerUser;public Employee getActionOwnerUser() return actionOwnerUser;public void setActionOwnerUser() //您的手动映射代码 actionOwnerUser = //您的手动映射代码 - NickJI
显示剩余2条评论
1个回答

6

请尝试使用以下映射:

@ManyToOne
@JoinColumn(
    name = "workflow_instance_id", 
    referencedColumnName = "workflow_instance_id",
    insertable = false, 
    updatable = false
)
private WorkflowInstance workflowInstance;

@ManyToOne
@JoinColumnOrFormula(
    formula = @JoinFormula(
            value="(SELECT a.work_action_class_id FROM WorkActionClass a WHERE a.role_class_id = role_class_id)", 
        referencedColumnName = "work_action_class_id"
    )
)
private WorkActionClass workActionClass;

@ManyToOne
@JoinColumns( {
    @JoinColumn(
        name = "workflow_instance_id", 
        referencedColumnName = "workflow_instance_id"),
    @JoinColumn(
        name = "role_class_id", 
        referencedColumnName = "role_class_id")
})
private WorkflowInstancePlayer player;

你的@JoinColumnOrFormula帮了大忙。请看我的帖子,我认为公式应该在WorkflowInstancePlayer映射上。虽然编译正常,表格也按预期创建,但现在在检索时出现ORA-01799错误:列不能与子查询进行外连接。 - jeff
好的。对于那个错误,将关联设置为LAZY,并确保不使用JOIN FETCH,以允许Hibernate使用次要查询检索它。 - Vlad Mihalcea
嗯,我已经点击并点赞了,然后添加了我的评论。在IE中提交评论时出现了卡顿,所以我将其复制到剪贴板中,刷新页面后再次粘贴。点赞可能也超时了。让我尝试一下LAZY,看看我们能否关闭这个问题。 - jeff
谢谢。我希望它能有所帮助。 - Vlad Mihalcea
很好。在WorkflowInstancePlayer上,我添加了@ManyToOne(fetch=FetchType.LAZY)。我不得不修改连接公式,使用实际表名而不是实体“SELECT a.role_class_id FROM WF_WORK_ACTION_CLASS”和“SELECT a.role_class_id FROM WorkActionClass”,它可以工作了。谢谢! - jeff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接