比如说有两个家伙, 其中一个是Loginnable(接口), 如下:
import javax.persistence.Access;
import javax.persistence.AccessType;
import javax.persistence.Column;
import javax.persistence.Embeddable;@Embeddable
@Access(AccessType.PROPERTY)
public interface Loginnable {
@Column
String getUserName();
@Column
String getPassword();

void setUserName(String userName);
void setPassword(String password);
}再来一个实体, 如下:@Entitypublic class Student implements Serializable {
@Id @GeneratedValue
private Long id;

@Embedded
private Loginnable login;

private static final long serialVersionUID = 1L; public Student() {
super();
} public void setId(Long id) {
this.id = id;
} public Long getId() {
return id;
} public void setLogin(Loginnable login) {
this.login = login;
} public Loginnable getLogin() {
return login;
}
   
}这样eclipse报错, 强行编译, 然后运行, 抛异常, 比如不能实例化接口和抽象类什么的.
你不能让我用接口, 我还怎么编程.

解决方案 »

  1.   

    @MappedSuperClass
    你需要这个。类中映射支持接口映射的。
    如Hibernate
    @ManyToAny
      

  2.   


    我把接口Loginnable改成了@MappedSuperclass, 然后发布的时候抛出异常:Could not determine type for: com.Loginnable, at table: Student, for columns: [org.hibernate.mapping.Column(login)]
      

  3.   

    呵呵,也不能这么说,对于一般人来说,用xml配置比较难学,用jpa却好接受一些
      

  4.   

    我是楼主, 别搞错了.import javax.persistence.Access;
    import javax.persistence.AccessType;
    import javax.persistence.Column;
    import javax.persistence.Embeddable;//回复2楼,用@MappedSuperclass貌似不行,这个注解说明可以扩展它构建一个实体
    //然而我这里用的是组合, 而不是继承.
    @Embeddable
    @Access(AccessType.PROPERTY)
    public interface Loginnable {
        @Column
        String getUserName();
        @Column
        String getPassword();
        
        void setUserName(String userName);
        void setPassword(String password);
    }
    再来一个实体, 如下:@Entitypublic class Student implements Serializable {
        @Id @GeneratedValue
        private Long id;
        
        @Embedded
        private Loginnable login;  //估计是这里出了问题
        
        private static final long serialVersionUID = 1L;    public Student() {
            super();
        }    public void setId(Long id) {
            this.id = id;
        }    public Long getId() {
            return id;
        }    public void setLogin(Loginnable login) {
            this.login = login;
        }    public Loginnable getLogin() {
            return login;
        }
       
    }
    这样eclipse报错, 强行编译, 然后运行, 抛异常, 比如不能实例化接口和抽象类什么的.
    你不能让我用接口, 我还怎么编程.
      

  5.   

    楼主,你这样玩JPA就跟 找女朋友时候 你非要找个男的来当女朋友 合适么?
      

  6.   

    顶10楼,何必非用接口,用继承不就解决你的问题了吗?
    @Entity
    @Table(name="tb_loginnable")
    @Inheritance(strategy=InheritanceType.JOINED)
    public class Loginnable {
    }@Entity
    @Table(name="tb_student")
    @PrimaryKeyJoinColumn(name="id", referencedColumnName="id")
    public class Student extends Loginnable 
      

  7.   

    知道为什么吗? 因为jpa的那玩意叫实体, 所谓实体就是不能有任何虚的东西. 如果你将一个接口作为属性, 那么你将这个实体存入数据库是没有问题的, 但是如果你要从数据库初始化相应的实体, 那就有问题了, 因为容器不知道要用该接口的哪一个具体实现来初始化它. 正如你的那个Loginnable那样, 要用哪一个实现了它的具体子类来初始化它呢?