Есть ли способ загрузить сущность в экземпляр производного класса? - PullRequest
1 голос
/ 16 сентября 2011

У меня есть сущность и специализированный класс, производный от сущности. Есть ли способ (что-то хитрое в JPA или Spring) позволить JPA создавать экземпляры производного класса вместо класса сущностей?

В противном случае мне нужно было бы создать «конструкторы копирования» для каждого производного класса. Или замените наследство делегатами, которые кажутся неуклюжими.

Ответы [ 3 ]

2 голосов
/ 16 сентября 2011
  • Если ваша сущность имеет много подклассов, которые должны храниться в базе данных по-разному, вы можете использовать поддержку наследования JPA (@Inheritance и т. Д.).

  • Если у вашей сущности есть только один подкласс, который должен всегда использоваться вместо этой сущности, вы можете аннотировать этот подкласс как @Entity, а сущность - как @MappedSuperclass.

  • ЕслиЕсли вы хотите выполнить предыдущий случай без изменения сущностей, вы можете использовать решения для конкретного поставщика.Например, в Hibernate вы можете зарегистрировать пользовательский Interceptor и переопределить его instantiate() метод.

1 голос
/ 16 сентября 2011

Если вы хотите только подмножество свойств объекта и не хотите изменять объект, тогда я предлагаю использовать сводный запрос стиля.

@Entity
@Table(name="test_entity")
public class TestEntity extends BaseDomainObject<Long> {

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(name = "name")
    private String name;


    public Long getId() {
        return id;
    }


    public void setId(Long id) {
        this.id = id;
    }


    public String getName() {
        return name;
    }


    public void setName(String name) {
        this.name = name;
    }
}

public class TestSummary {

    private final Long id;

    private final String name;

    public TestSummary(Long id, String name) {
        super();
        this.id = id;
        this.name = name;
    }

    public Long getId() {
        return id;
    }


    public String getName() {
        return name;
    }
}

Тогда вы можете использовать запрос, подобный этому:

select new TestSummary(te.id, te.name) from TestEntity te

JPA сгенерирует быстрый запрос, который загружает только те поля, которые вы хотите. Я использую это все время при отображении списка сущностей.

0 голосов
/ 16 сентября 2011

Я решил это сейчас с помощью ломбокса делегата аннотации.

@Entity
public class MyEntity {
   ...
}

public class MyBusinessObject {
   @Delegate
   private MyEntity entity;

   // other non persistent stuff
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...