JPA наследование одной таблицы не может загрузить правильный объект - PullRequest
0 голосов
/ 03 февраля 2012

У меня есть 2 класса:

@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());

    }

Первый тест: в БД для этой записи с 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 должен быть значением столбцов дискриминатора.

Есть идеи, как решить проблему?

С уважением Massimo

1 Ответ

0 голосов
/ 05 февраля 2012

Я нашел проблему. Я забыл вставить ссылку на подкласс в дескриптор единицы сохраняемости.

Теперь все отлично работает.

Massimo

...