5

我想知道如何注释界面

@Entity
@Table(name = "FOLDER_TABLE")
public class Folder implements Serializable, Hierarchy {

   @Id
   @GeneratedValue(strategy = GenerationType.AUTO)
   @Column(name = "folder_id", updatable = false, nullable = false)
   private int fId;

   @Column(name = "folder_name")
   private String folderName;

   @OneToMany(cascade = CascadeType.ALL)
   @JoinTable(name = "FOLDER_JOIN_FILE_INFORMATION_TABLE", joinColumns = 
{ @JoinColumn(name = "folder_id") }, inverseJoinColumns = 
{ @JoinColumn(name = "file_information_id") })
    private List< Hierarchy > fileInformation = new ArrayList< Hierarchy >();
}

上面和下面是 2 个实现名为 Hierarchy 的接口的类,文件夹类有一个层次结构列表,即文件夹或文件信息类

@Entity
@Table(name = "FILE_INFORMATION_TABLE")
public class FileInformation implements Serializable, Hierarchy {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  @Column(name = "file_information_id", updatable = false, nullable = false)
  private int ieId;
  @Column (name = "location")
  private String location;
}

我已经在网上搜索了某种注释或解决方法,但我无法映射界面,这就是这个

public interface Hierarchy {

}

我在带有文件夹的层次结构列表上得到一个映射异常,但我不知道如何正确映射该类。

4

2 回答 2

11

您可以在 Hibernate 中映射接口,作为继承层次结构的一部分。这在使用 XML 映射时肯定是可能的,正如在 Hibernate 参考的第 9 章中所描述的那样。

不过,基于注释的映射是另一回事。我对它不是很熟悉,但是Java Persistence with Hibernate也包含了这方面的示例。适应你的情况,它看起来像

@MappedSuperclass
public interface Hierarchy {
}

@Entity
@Table(name = "FOLDER_TABLE")
public class Folder implements Serializable, Hierarchy { ... }

@Entity
@Table(name = "FILE_INFORMATION_TABLE")
public class FileInformation implements Serializable, Hierarchy { ... }

此映射将使用具有隐式多态性的每个具体类的表。

但是,其他消息来源表明,对接口的注释支持可能还没有工作/稳定:

所以你可能需要试验,包括改变你的继承映射策略,也许把接口变成一个抽象类(如果可能的话——因为一个类只能扩展一个基类)......

于 2010-04-06T21:29:23.750 回答
1

一个小小的谷歌搜索出现了......

您可以在内部使用接口,但 不能在 hibernate 中映射接口,您必须映射类,无论您使用的是 xml 映射还是注解映射。hibernate 正在处理持久对象的生命周期,因此它需要知道要实例化哪个类,因此您需要向它提供此信息……我什至不确定您的建议会是什么样子?您将如何为给定的接口提供实现以在运行时休眠以进行实例化?

http://forum.springsource.org/showthread.php?t=67420

所以看起来你运气不好。

于 2010-04-06T17:05:32.943 回答