鉴于下面的类有没有人知道为什么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;
}
}
非常感谢
答案 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#bnbqp和JPA doesn't support interfaces well..implications?