使用属性访问器方法时EclipseLink实体映射问题

时间:2011-07-20 19:47:56

标签: java jpa eclipselink

鉴于下面的类有没有人知道为什么Eclipse的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 个答案:

答案 0 :(得分:2)

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 :(得分:1)

感谢与this question相关联的人 - 它帮助我找到了解决问题的方法如下:

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

答案 2 :(得分:0)

您无法在界面上进行注释或查询。您只能查询@Entity类,这些类只能放在实际类而不是接口上。使用@MappedSuperclass注释进行继承。

请参阅:http://download.oracle.com/javaee/6/tutorial/doc/bnbqn.html#bnbqpJPA doesn't support interfaces well..implications?

相关问题