Hibernate: невозможно разрешить атрибут по пути для очень простой иерархии объектов - PullRequest
0 голосов
/ 21 августа 2011

У кого-нибудь есть идеи, почему hibernate v3.6.7 имеет проблемы с кажущейся простой иерархией классов ниже?

@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);
}

При попытке выполнить этот тест выдается следующее исключение:

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)

Ответы [ 3 ]

0 голосов
/ 21 августа 2011

Обратите внимание, что проблема в этом, но на что нужно посмотреть:

  • Вы не должны использовать другую сущность и @Id.Я не уверен, возможно ли это.Используйте Embeddable или @IdClass
  • для получения и установки полей.
0 голосов
/ 21 августа 2011

У меня такое ощущение, что отображение немного неправильное.

Во-первых, X отсутствует @Embeddable, а Yx должен отображаться как @EmbeddedId, а не @Id.

Расширение того, что сказал Божо, если вы хотите использовать класс какИдентификатор и сущность, вам нужно создать суперкласс и один подкласс каждого использования (PK и сущность) с аннотациями сопоставления.

0 голосов
/ 21 августа 2011

Что это?

X() {

}

я думаю, что должен быть пустой конструктор!

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

почему вы используете аннотацию @id для класса -> X я думаю, что сгенерированное значение, такое как id, должно быть длинным!

у.е.

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