присоединиться по внешнему ключу с Hibernate - PullRequest
2 голосов
/ 06 октября 2010

Я новичок в спящем режиме, и у меня возникла проблема при попытке объединить 2 таблицы с помощью спящего режима.То, что я пытаюсь сделать, это получить список товаров, которые есть у определенного магазина в зависимости от идентификатора магазина, но я получаю список всех доступных товаров в базе данных, перечисленных под каждым магазином.

Воткод для Product.java:

@Entity
@Table (name = "products")
public class Product implements Serializable{

/**
 * 
 */
private static final long serialVersionUID = -1001086120280322279L;

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column (name = "product_id")
private int product_id;

@Column(name = "product_name", unique=true)
private String product_name;

@JoinColumn(name = "store", referencedColumnName="store_id")
@ManyToOne(cascade=CascadeType.ALL)
private Store store;

и т. д.

и вот код для Store.java:

@Entity
@Table(name = "stores")
public class Store implements Serializable{
/**
 * 
 */
private static final long serialVersionUID = 4497252090404342019L;

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column (name = "store_id")
private int store_id;

@Column(name = "store_name", unique=true)
private String store_name;

@JoinColumn(name="store", referencedColumnName= "store_id")
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
private List<Product> productList;

и т. д.

Вот вывод: (продукты A должны быть под Butik A и продукты B под Butik B)

Butik: Butik A
Produkt: Banana A
Produkt: Morot A
Produkt: Banana B
Produkt: Apple B

Butik: Butik B
Produkt: Banana A
Produkt: Morot A
Produkt: Banana B
Produkt: Spple B

У меня есть 2 дополнительных класса, ProductDAO и StoreDAO, которые заботятся о запросе, код подобен воба класса, кроме имени таблицы / имени класса.

public class ProductDAO { 
   public static List<Product> getStoreProductsList() { 
     Session hibernateSession = HibernateUtil.getSession(); 
     hibernateSession.beginTransaction();    
     Query query = hibernateSession.createQuery("from Product");
     hibernateSession.getTransaction().commit();     
     List<Product> storeProducts = query.list(); 
     return storeProducts;   
   }
}

Есть ли способ решить эту проблему только с помощью спящего режима?

Спасибо

Ответы [ 2 ]

7 голосов
/ 06 октября 2010

После просмотра вашего комментария.Похоже, что вы никогда не устанавливали там условия, конечно, тогда вы в конечном итоге получите все продукты, независимо от того, к какому магазину они принадлежат.Не удивительно.Где вы указываете критерии?

Вы можете сделать что-то вроде

// One liner
List<Product> list = session.createQuery("from Product p where p.store.store_id = "
          +" :storeId").setInteger("storeId", storeId).list();

Или вы можете получить Store и затем получить список Product, как показано ниже,

// Another one liner
List<Product> list = session.createCriteria(Store.class)
             .add(Restrictions.eq("store_id", storeId)).list().getProductList();

Другой и более простой способ, поскольку мы знаем, что store_id - это первичный ключ (спасибо Pakore за напоминание)

// And another. Changed to use load() instead of get() here. 
// Assuming non-existance is an error.
List<Product> list = (Store) session.load(Store.class,storeId).getProductList();

[Отредактировано]

... чтобы добавить пару полезных указателей (благодаря Pascal )

14.3 Ассоциации и объединения

14.4 Формы синтаксиса объединения

4 голосов
/ 06 октября 2010

Проблема в вашем запросе, он просто выбирает все продукты в системе, независимо от магазина.

Попробуйте использовать критерии гибернации.Легче создавать запросы к базе данных, и вы всегда можете работать со стороны «Java» вместо «стороны» БД.

int storeid = 1 //whatever you want here.
Criteria criteria = session.createCriteria(Product.class);
criteria.add(Restrictions.eq("store_id",storeid));
List<Product> list = criteria.list();

list будет содержать список продуктов, которые принадлежатStore с storeid равным storeid, который вы предоставляете.

Но для этого простого запроса даже проще , если вы используете session.get() или session.load() (разница междуони находятся в этом ответе или более подробной информации о них в документации )

int storeid = 1; //Whatever you want
Store store = (Store) session.get(Store.class,storeid);
List<Product> list = store.getProductList();

Как видите, Hibernate позаботится о том, чтобы объединить вас :).

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