Java JPA实体映射,该映射基于其他两个实体映射

Java JPA实体映射,该映射基于其他两个实体映射,java,hibernate,jpa,orm,hibernate-mapping,Java,Hibernate,Jpa,Orm,Hibernate Mapping,不确定这是否可行,但尝试映射WorkflowInstancePlayer,该映射基于以下实体中的两个其他实体映射,WorkActionClass和WorkflowInstance public class Action implements Serializable { @Id private Long action_id; @ManyToOne @JoinColumn(name = "work_action_class_id", referencedColumnName = "work_ac

不确定这是否可行,但尝试映射
WorkflowInstancePlayer
,该映射基于以下实体中的两个其他实体映射,
WorkActionClass
WorkflowInstance

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;

WorkflowInstanceLayer是基于
workflow\u instance\u id
role\u class\u id
派生的,但是
role\u class\u id
实际上是
workActionClass
上面映射的
(workActionClass.role\u class\u id)



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
因此,在Action实体中,我知道工作流实例播放器是Id为111222的雇员,而实际上没有将徽章存储在Action表中

更新 根据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"))
})
尝试使用此映射:

@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;

badge=111222是工作流\u实例\u id(=2)和角色\u类\u id(=3)的一些函数-正确吗?。。。。如果不是,你如何推导badge=111222?不是真的。这是一个工作流应用程序。员工111222被指定为工作流中的审阅者。根据工作流类型,审阅者将有许多操作。Oracle序号2是工作流实例id的下一个内联项,审阅者角色的角色\u类\u id为3。所以这三个值被插入到WorkflowInstancePlayer@NickJI我重读了你的评论。如果你的意思是“关系”中的功能,那么是的。起初,我把它理解为“一个公式”,比如实例id乘以角色id除以。。。。等等。关系在WorkflowInstancePlayer表中定义。要访问员工,您需要访问WorkflowInstancePlayerId,但来自RoleClass或WorkflowInstance,因此,您需要遍历一对多-没有任何东西可以告诉您哪个是正确的WorkflowInstancePlayerId-因此我认为particualr方法不起作用。什么是变通方法?我在想@Transient,然后手动映射??你的@JoinColumnOrFormula帮了忙。请参阅我的帖子,我相信公式应该在WorkflowInstanceLayer映射上。事情会编译,我的表看起来会像预期的那样创建,但现在我得到了ORA-01799:在检索时,列可能不会外部连接到子查询。太好了。对于该错误,请将关联设置为惰性,并确保您不加入获取它,以允许Hibernate通过二次查询检索它。嗯,我确实单击并向上投票,然后添加了我的注释。评论在IE中提交,所以我复制到剪贴板,刷新页面并再次粘贴。投票也必须有时间。让我试试懒惰,看看我们是否可以结束这个问题谢谢。我希望能有帮助。很好。在WorkflowInstancePlayer上,我添加了@ManyToOne(fetch=FetchType.LAZY)。我不得不修改joinformula以使用实际的表名,而不是实体“从WF\U WORK\U ACTION\U class中选择a.role\U class\id”和“从WorkActionClass中选择a.role\U class\U id”,这样就可以了。谢谢
@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;