Проблема отображения сущности EclipseLink при использовании методов доступа к свойствам - PullRequest
1 голос
/ 20 июля 2011

Учитывая класс ниже, кто-нибудь знает, почему реализация JPA в EclipseLink не может сопоставить их с объектами базы данных?Возвращается следующая ошибка:

В классе сущности [class com.my.entity.Y] первичный ключ не указан.Он должен определять либо @Id, @EmbeddedId, либо @IdClass.Если вы определили PK с помощью любой из этих аннотаций, убедитесь, что в иерархии классов сущностей нет смешанного типа доступа (аннотированные поля и свойства).

@Entity
@Access(AccessType.PROPERTY)
public interface Y {

    void setId(Long id);

    @Id
    Long getId();
}

@Entity
public class Z implements Y {

    long id;

    @Override
    public void setId(Long id) {
        this.id = id;
    }

    @Override
    public Long getId() {
        return id;
    }
}

Большое спасибо

Ответы [ 3 ]

2 голосов
/ 21 июля 2011

EclipseLink поддерживает запросы и связи с интерфейсами, но в настоящее время не в аннотациях.

Для сопоставления интерфейса вы можете использовать SessionCustomizer.

public class MyCustomizer implements SessionCustomizer {
    public void customize(Session session) {
      RelationalDescriptor descriptor = new RelationalDescriptor();
      descriptor.setJavaInterface(Y.class);
      descriptor.setAlias("Y");
      session.addDescriptor(descriptor);
    }
}

Отображение интерфейса позволяет запрашивать интерфейс, который возвращает любой из его подклассов, и определять отношения с интерфейсом.

Если интерфейс используется через аннотацию @VariableOneToOne, он будет автоматически отображен.

1 голос
/ 25 июля 2011

Спасибо человеку, который связался с этим вопросом - он помог мне найти решение проблемы следующим образом:

    @Entity
    public interface Y {

        void setId(Long id);

        @Id
        Long getId();
    }

   // introduce intermediate abstract class which implements Y

    @Entity
    public abstract class X implements Y {

    }

    // make Z extends X

    @Entity
    public class Z  extends X {

        // use targetEntity = X.class where required
        // leaving this class still free to use interface Y

        long id;

        @Override
        public void setId(Long id) {
            this.id = id;
        }

        @Override
        public Long getId() {
            return id;
        }
    }
0 голосов
/ 21 июля 2011

Вы не можете комментировать или запрашивать информацию на интерфейсе.Вы можете запрашивать только @Entity классы, и они могут быть размещены только на реальных классах, а не на интерфейсах.Используйте аннотацию @MappedSuperclass для наследования.

См. Эти: http://download.oracle.com/javaee/6/tutorial/doc/bnbqn.html#bnbqp и JPA не поддерживает интерфейсы хорошо ... последствия?

...