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應該是鑑別器列的值。
任何想法如何解決這個問題?
親切的問候 馬西莫
請提供您收到的錯誤。 – Marthin 2012-02-03 15:57:03
錯誤是邏輯。 Cliente cliente = entityManager.find(Cliente.class,clienteId)不會返回正確的元素,因爲Where條件被放入並且鑑別器列的值與超級類硬編碼。 AND(COD_TIPOCLIENTE =?)= PF – 2012-02-03 16:29:20