Как создать два класса, имеющих одну и ту же сущность? - PullRequest
1 голос
/ 09 октября 2019

Давайте предположим, что у меня есть table person и у меня есть класс сущностей для него, с множеством полей, некоторые @Exposed, некоторые @Transient, некоторые @Temporal столбцы. Проблема в том, что загрузка n Person элементов занимает много времени, потому что для каждой записи есть некоторые поля, которые снижают производительность.

В качестве идеи для оптимизации я создал класс PersonSimplified, определяющий все элементыPerson, кроме "медленных" полей и методов. Все работало безукоризненно, но, к сожалению, это решение не очень элегантно, потому что такие вещи, как name, переопределены, а дублирование кода - путь к катастрофе. Моя идея состоит в том, чтобы обеспечить Person extends PersonSimplified, но не могу понять, как это сделать. У меня есть три важных класса, я дам их скелет здесь:

BaseEntity.java

@MappedSuperclass
@EntityListeners({BaseEntityListener.class})
public abstract class BaseEntity implements Cloneable {
    //Some fields and methods
}

PersonSimplified.java

@SuppressWarnings("serial")
@Entity(name="PersonSimplified")
@Table(name="person")
@Inheritance(strategy=InheritanceType.JOINED)
public class PersonSimplified extends BaseEntity implements Auditable, Serializable {
    //Lots of stuff
}

Person.java

@SuppressWarnings("serial")
@Entity(name="Person")
@Table(name="person")
@Inheritance(strategy=InheritanceType.JOINED)
public class Person extends PersonSimplified implements Auditable, Serializable {
    //Some slow stuff
}

Я получаю ошибку:

Зависимость цикличности внешнего ключа, включающая следующие таблицы: person, person

Однако я не собираюсь иметь какие-либо внешние ключи. Я хотел бы только реорганизовать код, чтобы гарантировать, что когда мне понадобится упрощенный человек, он будет доступен, когда он мне нужен вместе с медленными полями, тогда я смогу добиться этого и мне не придется дублировать мой код. Как мне этого добиться?

1 Ответ

1 голос
/ 10 октября 2019

Я думаю, что ваша проблема связана с наследованием @, попробуйте это:

PersonSimplified.java

@SuppressWarnings("serial")
@Entity(name="PersonSimplified")
@Table(name="person")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
public class PersonSimplified extends BaseEntity implements Auditable, Serializable {
    //Lots of stuff
}

Person.java

@SuppressWarnings("serial")
@Entity(name="Person")
@Table(name="person")
public class Person extends PersonSimplified implements Auditable, Serializable {
    //Some slow stuff
}

Выдолжен знать, что под капотом Hibernate генерирует столбец дискриминатора и значение дискриминатора для Person.

EDIT

Фактическим решением было создание промежуточного class, который extends BaseEntity и из которого расширены два других класса:

@MappedSuperclass
@EntityListeners({BaseEntityListener.class})
public abstract class BasePerson extends BaseEntity {
    //Everything which was part of PersonSimplified
}

, а затем я удостоверился в расширении этого class:

@SuppressWarnings("serial")
@Entity(name="PersonSimplified")
@Table(name="person")
@Inheritance(strategy=InheritanceType.JOINED)
public class PersonSimplified extends BasePerson implements Auditable, Serializable {

    public PersonSimplified() {
    }

}

и

@SuppressWarnings("serial")
@Entity(name="Person")
@Table(name="person")
@Inheritance(strategy=InheritanceType.JOINED)
public class Person extends BasePerson implements Auditable, Serializable {
    //Slow stuff
}

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

...