2015-07-14 22 views
14

Non sono sicuro se ciò è possibile ma si tenta di mappare WorkflowInstancePlayer player che è correlato in base a due altri mapping di entità, WorkActionClass e WorkflowInstance nell'entità sottostante.Mappatura entità JPA che è correlata in base a due altri mapping di entità

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; 


Il workflowInstancePlayer è derivato basato su workflow_instance_id e role_class_id ma role_class_id è davvero un attributo di workActionClass mappata sopra (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; 

dati esempio potrebbe essere:

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 

Così, alla azione Entity, saprò l'istanza di lettore del flusso di lavoro è dipendente con ID 111222 senza realmente memorizzare il badge nella tabella azione.

UPDATE

Basato sul post di Vlad ho ottimizzato per essere

@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

distintivo = 111222 è una certa funzione del workflow_instance_id (= 2) e role_class_id (= 3) - è corretto? .... se no come si ottiene badge = 111222? – NickJI

+0

non proprio. Questa è un'applicazione per il flusso di lavoro. Il dipendente 111222 è stato assegnato come revisore nel flusso di lavoro. Il revisore avrà molte azioni a seconda del tipo di flusso di lavoro. Il numero di sequenza Oracle di 2 è stato successivamente in linea per l'ID dell'istanza del flusso di lavoro e un ruolo del revisore ha un role_class_id di 3. Quindi questi tre valori vengono inseriti in WorkflowInstancePlayer – jeff

+0

@NickJI Rileggo il tuo commento. se intendi la funzione come in "una relazione" allora sì. Inizialmente l'ho letto come "una formula" come in instance_id volte role_class_id diviso per .... ecc. La relazione è definita nella tabella WorkflowInstancePlayer – jeff

risposta

6

Prova con questa mappatura:

@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

il tuo @JoinColumnOrFormula ha aiutato.Vedere il mio post, credo che la formula dovrebbe essere sul mapping WorkflowInstancePlayer. Le cose si compilano e le mie tabelle sembrano create come previsto, ma ora ottengo ORA-01799: una colonna non può essere esterna a una subquery durante il recupero. – jeff

+0

Grande. Per questo errore, crea l'associazione LAZY e assicurati di non associarla a FETCH, per consentire a Hibernate di recuperarla con una query secondaria. –

+0

hmm Ho fatto clic su e upvoted, quindi ho aggiunto il mio commento. Il commento presentato in IE è appeso così ho copiato negli appunti, ho aggiornato la pagina e l'ho incollata di nuovo. L'upvote deve avere anche il timeout. Lasciami provare LAZY e vediamo se possiamo chiudere questa Q out – jeff