2015-07-14 15 views
14

Nie jestem pewien, czy jest to możliwe, ale próbuję odwzorować WorkflowInstancePlayer player, która jest powiązana z dwoma innymi mapowaniami encji, WorkActionClass i WorkflowInstance w encji poniżej.Mapowanie jednostek JPA, które jest powiązane z dwoma odwzorowaniami jednostek:

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 pochodzi podstawie workflow_instance_id i role_class_idrole_class_id ale jest naprawdę attibute z workActionClass odwzorowane powyżej (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; 

Przykładowe dane byłoby:

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 

Więc w Jednostce działania, będę wiedzieć, Workflow Instance Player to urzędnik z Id 111222 bez faktycznie przechowywania odznaki w tabeli działania.

UPDATE

podstawie postu Vlada I tweaked to być

@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

odznaka = 111222 jest jakaś funkcja workflow_instance_id (= 2) i role_class_id (= 3) - czy to prawda? .... jeśli nie, to jak wyprowadzasz znaczek = 111222? – NickJI

+0

niezupełnie. To jest aplikacja przepływu pracy. Pracownik 111222 został przydzielony jako Recenzent w przepływie pracy. Recenzent będzie miał wiele działań w zależności od typu przepływu pracy. Numer sekwencyjny Oracle 2 był następny inline dla identyfikatora instancji workflow, a funkcja Reviewer Role ma atrybut role_class_id równy 3. Tak więc te trzy wartości zostaną wstawione do WorkflowInstancePlayer – jeff

+0

@NickJI Ponownie przeczytałem twój komentarz. jeśli masz na myśli funkcję "w związku", to tak. Na początku przeczytałem to jako "formułę", jak w przypadku id_wystąpień, gdzie klasa_certyfikatu podzielona przez .... itd. Relacja jest zdefiniowana w tabeli WorkflowInstancePlayer – jeff

Odpowiedz

6

Spróbuj z tym mapowaniem:

@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

pomógł Ci @JoinColumnOrFormula.Zobacz mój post, myślę, że formuła powinna być na mapowaniu WorkflowInstancePlayer. Kompilacja rzeczy i moje tabele wyglądają tak, jakby były tworzone zgodnie z oczekiwaniami, ale teraz otrzymuję ORA-01799: kolumna może nie być połączona zewnętrznie z podzapytaniem podczas pobierania. – jeff

+0

Świetnie. W przypadku tego błędu utwórz powiązanie LOOZY i upewnij się, że nie JEZDĄC PONOWNIE, aby umożliwić Hibernate odzyskanie go za pomocą zapytania dodatkowego. –

+0

hmm kliknąłem i przegłosowałem, a następnie dodałem mój komentarz. Komentarz przesłany w IE został zawieszony, więc skopiowałem go do schowka, odświeżyłem stronę i wkleiłem ponownie. Awans musi również mieć limit czasu. Pozwól mi spróbować LAZY i zobaczyć, czy możemy zamknąć to Q out – jeff