Сложность создания отношений с абстрактным классом и встроенным атрибутом с помощью JPA / Hibernate - PullRequest
0 голосов
/ 08 мая 2018

Я пытаюсь, но пока не удалось, используя следующие классы с Hibernate.

@MappedSuperclass
@Embeddable
    public abstract class Foo {
        //  atributes...
    }

@Embeddable
    public class Poo extends Foo {
        // atributes...
    }

@Entity  
@Table
public class None {

    // atributes...

    @Embedded
    private Foo foo;

    // constructor
    public None(Foo foo) {
        this.foo = foo;
        }
    }

 // example of save
None none = new None(Poo poo);    

save(none);

Hibernate возвращает: Невозможно создать экземпляр абстрактного класса или интерфейса

Можно ли выполнить эту операцию с JPA?

1 Ответ

0 голосов
/ 19 марта 2019

Я столкнулся с той же проблемой.

Похоже, @embedable не работает с @DiscriminatorColumn. Единственный способ заставить это работать - использовать @DiscriminatorColumn, но обрабатывать @embedable как отдельную сущность в той же таблице. Это означает, что запрос, скорее всего, присоединит таблицу к самому себе.

@Entity
@Table(name="tbComputers")
public class Computer{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public long id;     

    public String motherboard;    

    @OneToOne
    @JoinColumn(name="id")
    public CPU cpu;    
}

@Entity
@DiscriminatorColumn(name="cpu_type")
@Table(name="tbComputers")
public abstract class CPU {

    @Id
    private Long id;

    @Column(name = "cpu")
    public String name;

    public abstract String someProcessorSpecificMethod();

}

@Entity
@DiscriminatorValue("Intel")
public class Intel extends CPU {

    @Override
    public String someProcessorSpecificMethod() {
        return "Intel";
    }

}

@Entity
@DiscriminatorValue("AMD")
public class AMD extends CPU {

    @Override
    public String someProcessorSpecificMethod() {
        return "AMD";
    }

}

РЕДАКТИРОВАТЬ: После дальнейшего тестирования я обнаружил, что хотя это работает для чтения данных, но не для сохранения. Это создаст отдельную вставку. Похоже, что это не поддерживается https://hibernate.atlassian.net/browse/HHH-1910. Альтернативой является разделение таблицы.

...