1

数週間前から 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() );
    }
}
4

1 に答える 1

0

In Bundle class change from

@OneToMany (mappedBy="bundle", targetEntity=Bundle.class)

to

@OneToMany (mappedBy="bundle", targetEntity=Item.class)

or remove parameter targetEntity at all.

From Hibernate documentation:

@ManyToOne has a parameter named targetEntity which describes the target entity name. You usually don't need this parameter since the default value (the type of the property that stores the association) is good in almost all cases. However this is useful when you want to use interfaces as the return type instead of the regular entity.

于 2013-08-31T22:11:55.100 に答える