2012-02-03 27 views
0

我有這2類:JPA單表繼承無法加載正確的對象

@Entity 
@Table(name = "S_MC_CC_CLIENTI") 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name="COD_TIPOCLIENTE") 
@DiscriminatorValue("PF") 
public class Cliente implements Serializable { 
... 
} 

@Entity 
@DiscriminatorValue("PM") 
public class ClienteMinore extends Cliente { 

    @Override 
    public String toString() { 
     return new ToStringCreator(this).append("cliente=" + super.toString()).toString(); 
    } 
} 

此測試嘗試加載的對象。

@Test 
    public void testGetItemPersonaFisica() { 
     EntityManager entityManager = factory.createEntityManager(); 
     entityManager.getTransaction().begin(); 

     Cliente.ClienteId clienteId = new Cliente.ClienteId(codiceAbi, btUtenteProfilo);   

     Cliente cliente = entityManager.find(Cliente.class, clienteId); 
     assertNotNull(cliente); 
     System.out.println(cliente); 
     System.out.println(cliente.getTipologiaCliente()); 

    } 

第一次測試:在DB上爲COD_TIPOCLIENTE = PF記錄所有工作都很好。 但是,當我改變值與COD_TIPOCLIENTE = PM我得到一個錯誤,因爲查詢從JPA觸發是:

SELECT * FROM S_MC_CC_CLIENTI WHERE (((COD_ABI = ?) AND (ANAG_UTENTE = ?)) AND (COD_TIPOCLIENTE = ?)) 
bind => [01025, 71576493, PF] 

看來,生成的查詢是錯誤的,因爲關鍵是[01025,71576493],而PF應該是鑑別器列的值。

任何想法如何解決這個問題?

親切的問候 馬西莫

+0

請提供您收到的錯誤。 – Marthin 2012-02-03 15:57:03

+0

錯誤是邏輯。 Cliente cliente = entityManager.find(Cliente.class,clienteId)不會返回正確的元素,因爲Where條件被放入並且鑑別器列的值與超級類硬編碼。 AND(COD_TIPOCLIENTE =?)= PF – 2012-02-03 16:29:20

回答

0

我發現這個問題。我忘了在持久性單元描述符中插入子類引用。

現在所有的作品都很棒。

Massimo