2015-07-14 17 views
14

Bunun mümkün olup olmadığından emin olun, ancak WorkflowInstancePlayer player eşlemini, ilgili diğer iki eşleme eşleştirmesi, WorkActionClass ve WorkflowInstance temel alınarak aşağıdaki eşlemede eşleştirmeye çalışın.JPA Varlık Eşlemesi, diğer iki nesne eşlemesine göre ilişkili

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_id ve role_class_id ancak role_class_id göre türetilir (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; 


üzerinde eşlenen workActionClass bir attibute gerçekten
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; 

Örnek verileri olacaktır:

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 

Yani Eylem Varlık içinde, ben İş Akışı Örneği Oyuncu aslında Eylem tablosunda rozeti kaydetmeden Id 111222 ile Çalışan olduğunu bileceksiniz.

GÜNCELLEME

Ben tweaked Vlad yazı dayanarak bu

@ManyToOne(fetch=FetchType.LAZY) 
    @JoinColumnsOrFormulas({ 
    @JoinColumnOrFormula([email protected](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")) 
}) 
+0

rozet = 111222 workflow_instance_id bazı fonksiyonudur (= 2) ve role_class_id (= 3) - doğru mu? .... değilse nasıl bir rozet türetiyorsunuz = 111222? – NickJI

+0

gerçekten değil. Bu bir iş akışı uygulamasıdır. Çalışan 111222 iş akışında Gözden Geçiren olarak atanmıştır. Gözden geçirenin iş akışı türüne bağlı olarak birçok eylemi olacaktır. 2'nin Oracle dizi sayısı, iş akışı örneği kimliği için satır içi satırdaydı ve bir Yorumcu Rolü, bir role_class_id 3 değerine sahip. Bu üç değer, WorkflowInstancePlayer uygulamasına eklenir – jeff

+0

@NickJI Yorumunuzu tekrar okuyorum. Eğer "ilişki" kelimesinde olduğu anlamına gelirse evet. İlk olarak, example_id zamanlarında olduğu gibi "bir formül" olarak okudum. Role_class_id .... tarafından bölündü. İlişkisi, WorkflowInstancePlayerId'ye ulaşmanız gereken ancak RoleClass veya WorkflowInstance'dan gelmeniz gereken Çalışana ulaşmak için WorkflowInstancePlayer tablosunda – jeff

cevap

6

bu haritalama ile deneyin olmak:

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

adresinize yardımcı oldu.Gönderiyi gör, formülün WorkflowInstancePlayer eşlemesinde olması gerektiğine inanıyorum. Şeyler derleme ve tabloları beklendiği gibi oluşturuldu ama şimdi ORA-01799 olsun: bir sütun alınırken bir alt sorgunun dış birleştirilmemiş olabilir. – jeff

+0

Harika. Bu hata için, ilişkilendirmeyi LAZY yapın ve Hibernate'in ikincil bir sorguyla almasına izin vermek için FETCH JOIN'DEN FETCH olmadığından emin olun. –

+0

hmm Tıkladım ve yedekledim, ardından yorumumu ekledim. IE'de yorum gönderildi, böylece panoya kopyalandım, sayfayı yeniledik ve tekrar yapıştırdım. Yükseltmenin de zaman aşımı olması gerekir. LAZY'i deneyeyim ve bu Q'yu kapatabilir miyiz – jeff

İlgili konular