Как создать спящий объект из внешнего класса API? - PullRequest
0 голосов
/ 21 февраля 2019

Я пишу в API игрового движка, поэтому у меня нет прямого доступа к классам, и я не могу добавить аннотации гибернации (@Entity, @Table и т. Д.), Но я должен сохранить этот класс из API в моем объекте (таблица).Как я могу это сделать?Расширяет объект API и создает новые с аннотациями гибернации или анализирует этот объект в строку?Есть идеи?

Класс, например, что я имею в виду:

@Entity
@Table(name="users")
public class User {

    @Id
    @Column(name="id")
    private int id;

    @Column(name="location")
    private Location locationOfPlayer; // - this is the class from API

}

Ответы [ 3 ]

0 голосов
/ 21 февраля 2019

По сути, вам придется дублировать данные в ваших классах сущностей: т.е. создавать сущности с похожими полями и сохранять их, а не использовать классы API.У этого недостатка есть необходимость вручную обновлять модель данных, но с другой стороны, изменения в API не повредят код вашей базы данных напрямую.

Как только вы закончите дублированиеДля данных вы можете использовать инфраструктуру отображения (мне скорее нравится Mapstruct, потому что она выполняет отображение во время компиляции, но библиотеки времени выполнения, такие как Orika, также довольно популярны для этой задачи)

0 голосов
/ 22 февраля 2019

Для этого вы можете использовать файл сопоставления, который вы должны определить в своем файле persistence.xml:

<persistence version="2.0" ...>
   <persistence-unit name="database">
       <mapping-file>mapping.xml</mapping-file>
       ...
   </persistence-unit>
</persistence>

В своем файле сопоставления вы можете определять сопоставления ORM даже для сторонних классов:

<entity-mappings version="1.0" xmlns="http://java.sun.com/xml/ns/persistence/orm"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_1_0.xsd">
    <package>thirdparty</package>
    <entity class="Location" name="Location">
        ...
    </entity>
</entity-mappings>
0 голосов
/ 21 февраля 2019

Единственный реалистичный / хороший способ сделать это - Instrumentation.
Возможно, вы захотите создать и применить Java Agent, который преобразует нужные классы во время загрузки, добавляя аннотации JPA.Это в основном модификация байт-кода.

См., Например, ClassFileTransformer .

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