数週間前から Hibernate を使用しています。非常に便利なツールですが、次のタスクを解決できません。
テーブル:
Create Table `Product`
(
`product_id` INT(10) PRIMARY KEY,
`bundle_id` INT(10) NULL,
`product_type` VARCHAR(50) NOT NULL,
`title` VARCHAR(255) NOT NULL,
`desc` VARCHAR(255) NULL,
`price` REAL(10) NOT NULL,
...
);
Javaには3つのクラスがあります
@Entity
@Table(name = "Product")
@DiscriminatorColumn(name = "product_type")
public abstract class Product {
...
}
インスタンスには 2 つのタイプがあり、「アイテム」が「バンドル」に値する可能性がありますが、常にそうであるとは限りません。「バンドル」には少なくとも 1 つの「アイテム」があります
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorValue(value = "Item")
public class Item extends Product {
Bundle bundle;
....
@ManyToOne (fetch=FetchType.LAZY, targetEntity=Bundle.class)
@JoinColumn (name="bundle_id")
public Bundle getBundle() {...}
public void setBundle(Bundle bundle) {...}
....
}
と:
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorValue(value = "Bundle")
public class Bundle extends Product {
Set<Item> items;
....
@OneToMany (mappedBy="bundle", targetEntity=Item.class)
@OrderBy ("list_nr")
public Set<Item> getItems() {...}
public void setItems(Set<Item> items) {...}
....
}
実行時にデータを呼び出すことはできません。エラー: 予想される型: org.blah.Bundle、実際の値: org.blah.Item
誰かアイデアやヒントを持っていますか。google up&down を検索していますが、この特定の問題が見つかりません。
Hibernateがこれを試す理由がわからない:
Hibernate:
select
item0_.item_id as product1_7_,
item0_1_.price as price3_7_,
item0_1_.title as title4_7_,
item0_.bundle_id as bundle3_11_
from
Item item0_
inner join
Product item0_1_
on item0_.item_id=item0_1_.product_id
エラー:
01.09.2013 00:36:49 org.hibernate.property.BasicPropertyAccessor$BasicSetter
set ERROR: HHH000123: IllegalArgumentException in class: org.blah.Item,
setter method of property: bundle 01.09.2013 00:36:49
org.hibernate.property.BasicPropertyAccessor$BasicSetter set ERROR: HHH000091:
Expected type: org.blah.Bundle, actual value: org.blah.Item 01.09.2013 00:36:49
org.blah.QueryMngr findAllItems SEVERAL: get failed
findAllItems():
public static List<Item> findAllItems() {
log.debug("find all Item instances");
Session session = null;
try {
session = HibernateUtil.getSessionFactory().openSession();
session.getTransaction().begin();
List<Item> items = session.createQuery("From Item").list();
//for (Item item : items) {
// Hibernate.initialize(item.getBundle());
//}
session.getTransaction().commit();
log.debug("get successful");
session.close();
return items;
} catch (HibernateException exc) {
if (session != null) {
session.getTransaction().rollback();
session.close();
}
log.error("get failed", exc);
throw new RuntimeException( exc.getMessage() );
}
}