2012-02-07 13 views
3

Hibernateでマップされたエンティティを照会しようとしているときに例外がスローされたJSF Webアプリケーションがあります。私は間違って何をしていますか?それとも、Hibernateのバグですか?どうすれば修正できますか?JPA 2.0/Hibernate:スーパータイプが見つかりません

基本クラスShipmentUnitいくつかのサブクラスで:

@Entity 
@Table(name = "tat_shipment_unit") 
@Inheritance(strategy = SINGLE_TABLE) 
@DiscriminatorColumn(name = "unit_type", discriminatorType = CHAR, length = 1) 
@DiscriminatorValue("_") 
public abstract class ShipmentUnit implements Serializable { 
    private Long id; 
    private List<ShipmentAction> actions; 

    @Id @GeneratedValue 
    public Long getId() { return id; } // and corresponding setter 

    @OneToMany(mappedBy = "unit") 
    @OrderBy("listIndex") 
    public List<ShipmentAction> getActions() { return actions; } // and setter 

    // hashCode, equals etc. 
} 

ShipmentActionクラス:

@Entity 
@Table(name = "tat_shipment_action") 
@IdClass(ShipmentActionID.class) 
public class ShipmentAction implements Serializable { 
    private ShipmentUnit unit; 
    private int listIndex; 

    @Id @ManyToOne @NotNull 
    public ShipmentUnit getUnit() { return unit; } // and setter 

    @Id @Column(name = "list_index", nullable = false) 
    public int getListIndex() { return listIndex; } // and setter 
} 

ShipmentActionIDクラスご協力いただきありがとうございます:)

ここでは、関連するクラスでありますgetterメソッドとsetterメソッドで同じシグネチャを持つunitlistIndexプロパティもあります。

h:dataTableを表示したいとします。 TypedQueryは例外があることさem.createQuery(...)で作成する必要があります現時点で

CriteriaBuilder cb = em.getCriteriaBuilder(); 
CriteriaQuery<Number> query = cb.createQuery(Number.class); 
Root<ShipmentAction> root = query.from(ShipmentAction.class); 
Predicate predicates = ... 
int total = em.createQuery(
    query.select(cb.count(root).where(predicates) 
).getSingleResult().intValue(); 

:データモデルの実装では、(1)カウントし、それらの出荷アクションエンティティのため(2)クエリ、そのように基準APIを使用していますスロー:

[SEVERE] Error Rendering View[/tat/report/actions.xhtml]: java.lang.IllegalStateException: No supertype found 
at org.hibernate.ejb.metamodel.AbstractIdentifiableType.requireSupertype(AbstractIdentifiableType.java:85) 
at org.hibernate.ejb.metamodel.AbstractIdentifiableType.getIdType(AbstractIdentifiableType.java:173) 
at org.hibernate.ejb.criteria.expression.function.AggregationFunction$COUNT.renderArguments(AggregationFunction.java:110) 
at org.hibernate.ejb.criteria.expression.function.ParameterizedFunctionExpression.render(ParameterizedFunctionExpression.java:94) 
at org.hibernate.ejb.criteria.expression.function.BasicFunctionExpression.renderProjection(BasicFunctionExpression.java:71) 
at org.hibernate.ejb.criteria.QueryStructure.render(QueryStructure.java:250) 
at org.hibernate.ejb.criteria.CriteriaQueryImpl.render(CriteriaQueryImpl.java:338) 
at org.hibernate.ejb.criteria.CriteriaQueryCompiler.compile(CriteriaQueryCompiler.java:223) 
at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:619) 

私は、私は私の問題への解決策を見つけた7.

 <dependency> 
     <groupId>org.hibernate.javax.persistence</groupId> 
     <artifactId>hibernate-jpa-2.0-api</artifactId> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.jboss.spec.javax.ejb</groupId> 
     <artifactId>jboss-ejb-api_3.1_spec</artifactId> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.jboss.spec.javax.annotation</groupId> 
     <artifactId>jboss-annotations-api_1.1_spec</artifactId> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>javax.enterprise</groupId> 
     <artifactId>cdi-api</artifactId> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>javax.validation</groupId> 
     <artifactId>validation-api</artifactId> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-validator</artifactId> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-core</artifactId> 
     <version>4.0.0.Final</version> 
     <scope>provided</scope> 
    </dependency> 

答えて

4

のJBoss AS上で実行されている、Hibernateはバージョン4.0.0.Finalを使用しています。私は@Id注釈の代わりに@EmbeddedIdを使用して従属クラスShipmentActionのマッピングを変更しました。あなたが興味を持っている場合は、ここで更新クラス(ShipmentUnitクラスのマッピングはを変更していない)

@Entity 
@Table(name = "tat_shipment_action") 
public class ShipmentAction implements Serializable { 
    private @EmbeddedId Key id; 
    private @MapsId("unit_id") @ManyToOne ShipmentUnit unit; 

    public ShipmentAction() { 
     id = new Key(); 
    } 

    public ShipmentUnit getUnit() { return unit; } // and setter 

    public int getListIndex() { 
     return id.list_index; 
    } 

    public void setListIndex(int index) { 
     id.list_index = index; 
    } 

    @Embeddable 
    public static class Key implements Serializable { 
     public long unit_id; 
     public int list_index; 
     // hashCode() and equals() 
    } 
} 

オーケーがあり、これが動作しているようですし、私のLazyDataModel<ShipmentAction>
:-)今それを好きしかし、奇妙なことは、これがフィールド上のJPAアノテーションでのみ機能し、Hibernateがgetterメソッドのこれらのアノテーションにもう対処できないことです(少なくとも私の変更の影響を受けるクラスでは)。それについての考えは?

もう一つの少しの変化:ShipmentUnit.getActions()@javax.persistence.OrderBy注釈が何らかの理由で@org.hibernate.annotations.OrderByに置き換えなければなりませんでした。

+0

私はこれが必要でした。しかし、埋め込みキーに切り替えたとき、JpaRepositoryメソッドに '@Query(UserRel rからrを選択するとr.key.user1Id =?1")というアノテーションを付ける必要がありました。 \t public Iterable findByUser1Id(long id1) ; ' – Spencer

関連する問題