Интерфейсы со спящими аннотациями - PullRequest
5 голосов
/ 06 апреля 2010

Мне интересно, как я смогу комментировать интерфейс

@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 {

}

Я получаю исключение сопоставления в списке иерархий с папкой, но я не знаю, как правильно сопоставить класс.

Ответы [ 2 ]

11 голосов
/ 07 апреля 2010

Вы можете отобразить интерфейсы в Hibernate, как часть иерархии наследования. Это вполне возможно при сопоставлении XML, как это описано, в частности, в главе 9 Hibernate .

Отображение на основе аннотаций - это отдельная история. Я не очень знаком с ним, но Java Persistence с 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 { ... }

Это отображение будет использовать таблицу для каждого конкретного класса с неявным полиморфизмом.

Однако, другие источники предполагают, что поддержка аннотаций для интерфейсов может еще не работать / стабильно:

Так что вам, возможно, придется поэкспериментировать, включая изменение стратегии отображения наследования, возможно, превращение интерфейса в абстрактный класс (если это возможно - поскольку класс может расширять только один базовый класс) ...

1 голос
/ 06 апреля 2010

Небольшое прибегание к гуглу ...

Вы можете использовать интерфейсы внутри, но вы не можете отображать интерфейсы в спящем режиме , вам нужно сопоставить классы, независимо отВы используете отображение XML или отображение аннотаций.hibernate обрабатывает жизненный цикл ваших постоянных объектов, поэтому ему нужно знать, какой класс создавать, поэтому вам нужно предоставить ему эту информацию ... Я даже не уверен, как выглядело бы то, что вы предлагаете?Как бы вы предоставили реализацию для данного интерфейса, чтобы Hibernate во время выполнения для создания экземпляра?

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

Так что, похоже, вам не повезло.

...