Überwintern: Nicht lösen können-Attribut gegen Pfad für ein sehr einfaches Objekt-Hierarchie

Jemand irgendwelche Ideen, warum hibernate v3.6.7 hat Probleme mit der scheinbar einfachen Klassenhierarchie unten?

@Entity
public class X implements Serializable {
    @Id
    String id;

    X() {

    }

    public X(String id) {
        this.id = id;
    }
}

interface PK {
    Object getPK();
}

@Entity
public class Y  implements Serializable, PK {
    @Id
    @OneToOne
    @JoinColumn(name ="id")
    X x;

    protected Y() {

    }

    public Y(X x) {
        this.x = x;
    }

    @Override
    public Object getPK() {
        return x.id;
    }
}

private static final EntityManager em;
private final CriteriaBuilder cb = em.getCriteriaBuilder();
private final CriteriaQuery<Y> query = cb.createQuery(Y.class);
private final Root<Y> entity = query.from(Y.class);

static {
    Map<String, Object> properties = new HashMap<String, Object>();
        //initialise properties appropriately
    EntityManagerFactory emf =
        Persistence.createEntityManagerFactory("myPersistenceUnit", properties);
    em = emf.createEntityManager();

}

@Test
public void simpleTest() {
    X x1 = new X("X1");
    X x2 = new X("X1");
    List<Y> yy = new ArrayList<Y>();

    Y yX1 = new Y(x1);
    yy.add(yX1);

    Y yX2 = new Y(x2);
    yy.add(yX2);

    saveItems(yy);

    String name = "x";
    Path<Object> path = entity.get(name);
    Predicate restriction = cb.conjunction();
    restriction = cb.and(restriction, cb.and(new Predicate[]{cb.equal(path, x1)}));

    TypedQuery<Y> tq = em.createQuery(this.query);
    Y result = null;

    try {
        result = tq.getSingleResult();
    } catch (NoResultException e) {
    }

    assertNotNull(result);
}

Versuch zum ausführen dieser test wirft die folgende Ausnahme:

java.lang.IllegalArgumentException: Unable to resolve attribute [x] against path
    at org.hibernate.ejb.criteria.path.AbstractPathImpl.unknownAttribute(AbstractPathImpl.java:118)
    at org.hibernate.ejb.criteria.path.AbstractPathImpl.locateAttribute(AbstractPathImpl.java:223)
    at org.hibernate.ejb.criteria.path.AbstractPathImpl.get(AbstractPathImpl.java:194)
    at com.example.entity.impl.MyPersistenceTest.simpleTest(MyPersistenceTest.java:212)
InformationsquelleAutor | 2011-08-21
Schreibe einen Kommentar