2010-07-14 3 views
2

Я отобразил класс в JPA. :Экземпляр преобразования Hibernate в подкласс

@Entity 
@Inheritance(strategy = InheritanceType.JOINED) 
public class User { 
    private Long id; 
    private Long name; 
    //getters and setters go here 
    .... 
} 

У меня также есть подкласс этого класса, называемый Admin:

@Entity 
public class Admin extends User { 
    private String cridentials; 
    //getters and setters go here 
    .... 
} 

Сейчас в моем коде я управляемый экземпляр пользователя, прикрепленный к сессии

... 
User user = entityManager.find(User.class, userId) 

мне нужно для преобразования этого пользователя в его подкласс, Admin. Это означает, что мне нужно «Пользователь» табличные данные остаются нетронутыми и новая строка будет вставлена ​​в таблицу «Администратор»:

javax.persistence.EntityManager entityManager = ...; 
... 
User user = entityManager.find(User.class, userId) 
Admin admin = new Admin(); 
admin.setName(user.getName()); 

entityManager.persist(admin); 

Но после того, как я исполняю последнюю строку, другая строка вставляется в обоих пользователей и администратора таблиц. Как я могу это решить?

Единственный способ, который я нашел до сих пор, - это сохранить поля пользователя где-нибудь, а затем удалить этот экземпляр из БД, а затем создать новый Admin со всеми данными из класса User. Но я уверен, что есть намного лучший способ сделать это.

Благодаря

ответ

1

(...) Но после того, как я исполняю последнюю строку, другая строка вставляется в обоих пользователей и администратора таблиц. Как я могу это решить?

Ну, вы создали новый экземпляр Admin и называется persist на него, так что это именно то, что вы сказали Hibernate сделать. Попробуйте сделать снимок для выбранного примера User вместо Admin (не проверен).

Но есть что-то, что сработало с вашим дизайном, вы должны назначить какую-то роль вместо использования наследования здесь.

+0

На самом деле, у администратора есть много свойств, которые пользователь не должен иметь - вот почему я использую наследование. Пользователь не может быть отключен для администратора, поэтому 'Admin a = (Admin) user;' здесь не работает ... Проблема в том, что пользователь не является абстрактным, он используется системой, а также администратором. Тем не менее, я не могу «сказать» hibernate для создания нового Admin от текущего пользователя. Даже когда я устанавливаю ID администратора для пользователя и пытаюсь объединиться, он говорит, что администратор не управляется. –

Смежные вопросы