Spring + Hibernate DAO: метод get для многих ко многим

1

Согласно этому руководству:

Зимуют-многие-ко-многим-например, присоединиться стол-экстра-колонки-аннотаций

Я не могу использовать @id следующим образом:

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

public int getId() {
    return id;
}

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

но я должен реализовать StockCategoryId.java и StockCategory.java

теперь я реализую класс DAO для StockCategory.

Как я могу написать метод getStockCategory?

Для других объектов я всегда использовал что-то вроде этого:

public StockCategory getStockCategory(int id)  throws RecordNotFoundException
{   
    StockCategory stock_category= (StockCategory) getCurrentSession().get(StockCategory.class, id);

    return stock_category;
}

но в этих классах, которые реализуют мои отношения "многие ко многим", я должен реализовать один и тот же метод, но передав 2 идентификатора:

public StockCategory getStockCategory(int stock_id, int category)  throws RecordNotFoundException;

вопрос 1: Как я могу реализовать этот метод?

В качестве примера я покажу вам, как я реализую метод удаления:

public void deleteStockCategory(int stock_id, int category_id)  throws RecordNotFoundException
{       
    /*
    * get the record
    */
    StockCategory stock_category = getStockCategory(stock_id, category_id);


    /*
    * if exists, delete the record
    */
    if (stock_category != null)
    {       
        getCurrentSession().delete(stock_category );
    }
}

вопрос 2: должен ли я реализовать также класс DAO для StockCategoryId? Если да, какие методы мне нужно внести?

большое спасибо!

Теги:
hibernate
many-to-many
dao

2 ответа

2
Лучший ответ

Вопрос 1:
Вы используете аннотации JPA здесь с гибернацией. JPA требует, чтобы первичный ключ был завернут в тип, если вы хотите получить идентификатор. Для большинства ваших сущностей вы используете стандартный Java-тип, такой как long. В этом случае, хотя у вас есть составной первичный ключ (он состоит из нескольких полей). Это означает, что вы должны создать собственный тип (класс) для обертывания первичного ключа.

В примере, который вы уже сделали с классом StockCategoryId. Обратите внимание, что этот класс аннотируется как вложенный. Это не отдельный объект с собственной таблицей. Это группа столбцов, которые могут быть встроены в столько разных объектов, сколько вам нравится. В этом случае он используется для сбора вместе двух столбцов, которые формируют первичный ключ (используя аннотацию embeddedId). Так вот что должен ожидать ваш DAO, когда вы хотите получить конкретную запись.

public StockCategory getStockCategory(StockCategoryId id) throws RecordNotFoundException
{   
    StockCategory stock_category = 
      (StockCategory)getCurrentSession().get(StockCategory.class, id);

    return stock_category;
}

Вопрос 2:
Нет смысла создавать DAO для StockCategoryId, поскольку это не сам объект. Это всего лишь фрагмент сущности. Если вы попросите DAO получить StockCategoryId, какая таблица будет спящий запрос?

Заметка:
Возможно, вам не понадобится DAO для получения отдельных категорий акций. Вероятно, имеет смысл извлекать категории акций для отдельного запаса или категории. Для этого вы можете использовать соответствующий DAO для получения своего запаса или категории, а затем вызвать метод для получения коллекции StockCategory для этого объекта.

НАПРИМЕР

StockDAO dao = new StockDAO();
Stock stock = dao.findByPrimaryKey(1);
Set<StockCategory> stockCategories = stock.getStockCategories();

Или что-то в этом роде... надеюсь, что это поможет.

  • 1
    спасибо за очень подробный и понятный ответ! ты научил меня многим вещам
  • 0
    У меня большие проблемы с созданием формы с флажками для этого отношения многие ко многим .. Я написал вопрос об этом .. Если бы кто-то мог взглянуть, я был бы очень очень рад stackoverflow.com/questions/24633603/…
0

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

Класс id должен быть аннотирован с помощью @Embeddable:

@Embeddable
class StockCategoryId implements Serializable {
  Integer stockId;
  Integer categoryId;
}

в то время как у вашего объекта теперь будет поле типа StockCategory, аннотированное с @EmbeddedId вместо @Id;

@Entity
class StockCategory implements Serializable {
  @EmbeddedId StockCategoryId stockCategoryId;
}

Затем вы всегда будете использовать класс StockCategoryId при поиске объекта в контексте персистентности вместо того, с которым вы привыкли.

Взгляните на документы спящего режима для дальнейшего объяснения: http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html/entity.html#entity-hibspecententity

Однако я не уверен, где ваши отношения многие и многие в вашем примере модели данных, поскольку они являются составными ключами в одном объекте и что один объект не связан ни с чем другим.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню