2015-04-06 2 views
0

У меня есть 3-х слойный переход, как Superclass1-> subclass1-> subclass2. Я использую hiberate для создания этого проекта, и основная идея заключается в том, что при сохранении данных я хочу выполнить это на уровне Superclass1. Так что любой, кто расширяет этот суперкласс, сможет сохранять любые данные в соответствующей таблице только путем вызова метода.Как передать экземпляр подкласса суперклассу

Основная цель, почему я сделал это, - это иметь какое-то событие, когда я могу переопределить его, когда захочу. Это примерно так:

Это, чтобы все мои модели выполняли функции, которые мне нужны на более высоком уровне.

public class interfaces SuperModifier() { 

    Boolean save(); 

    void beforeSave(); 

    void afterSave(); 

    void delete(); 
} 

Это реализует класс интерфейсов. Чтобы выполнить функцию save() и другую функцию iplemetned. Я уже хорошо разбираюсь в сессии, и мне удалось сохранить данные уже. Я просто улучшаю свой код для масштабируемости и для его повторного использования.

public class Superclass implements SuperModifier{ 

    Object newInstance; 

    public Boolean save() { 

     try { 

      Session session = HibernateSessionFactory.getSessionFactory().openSession(); 
      Transaction transaction = session.beginTransaction(); 
      session.save(newInstance); <-- this part rigth here 
      transaction.commit(); 

     } catch (Exception e) { 
      // TODO: handle exception 
      e.printStackTrace(); 
      transaction.rollback(); 
     } 
    } 

    .... 
} 

Здесь я определяю все столбцы с аннотацией.

public class Subclass1 extends Superclass() { 

    // because this is hibernate 
    // I placed all my defintion of columns here 
} 

и этот класс, где расположены мои сеттеры и геттеры. и другие функции, которые мне могут понадобиться для этой модели.

public class Subclass2 extends Subclass1() { 


    // I placed all functions here like setters and getters 
} 

И, конечно, основная функция.

public static void main(String args[]) { 

    Subclass2 sub = new Subclass2(); 
    sub.setName("New Instance"); 
    sub.save(); // <--called because of the superclass 
} 

Вы видите линию session.save (newInstance);, что переменная newInstance - это то, с чем я столкнулся. как передать экземпляр, созданный в основном методе, чтобы сохранить его в суперклассе?

Я думал пропустить его через конструктор, но его невозможно, потому что он еще не создан. Я также думал о создании сеттера в суперклассе, чтобы установить newInstance, но когда я выполняю набор?

Я также думал sub.save (sub);, но это выглядит просто неправильно. :)

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

ответ

0

Смешайте свои Сущности с Упорно логики это не очень хорошая идея, потому что:

  • вы не можете контролировать границы транзакции правильно (ваш метод сохранения предполагает, что нет никакой операции в процессе, поэтому он пытается создать один)
  • Класс Entity имеет зависимости от классов API Hibernate, поэтому, если вы хотите экспортировать их на уровень пользовательского интерфейса, пользовательский интерфейс потребует зависимости от Hibernate.

Попробуйте отделить существующую логику в слое службы.

Что касается вашего вопроса, объект подкласса также является объектом суперкласса, поэтому вам нужно только его сохранить.

+0

Сначала я собираюсь сосредоточиться на этом, а затем увеличить его. Во всяком случае, функция save() существует и вызывается из-за суперкласса (Суперкласс). На созданный экземпляр экземпляра.save() он еще не сохранен, поскольку он все равно будет находиться внутри функции save() суперкласса, поскольку он не переопределяется. Теперь, когда он входит внутрь, проблема заключается в session.save (newInstance), где я не знаю, как передать переменную «newInstance», которая является созданным экземпляром в главном функционале «sub». – oneofakind

+0

«Суперкласс» newInstance - это атрибут экземпляра, и ваш метод 'save' должен, вероятно, сохранить эту' this' ссылку в любом случае. –

+0

нет, потому что в первую очередь переменная newInstance еще не объявлена ​​ни значением, ни инстанцированной в любой точке. Он может быть объявлен как глобальная переменная на Суперклассе, но это все, но не было никакой ценности. Или вы говорите, что я должен просто сделать что-то вроде session.save (this); вместо? – oneofakind

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