Помощь по составному шаблону с Hibernate - PullRequest
3 голосов
/ 09 апреля 2010

Так что я застрял, я создаю веб-приложение gwt, я буду использовать структуру дерева (gwt Tree и TreeItems), чтобы показать список папок (класс Folder) и файлов (класс FileLocation), папку и расположение файлов Все классы будут реализовывать интерфейс Hierarchy, основанный на классах на составном шаблоне. но я использую hibernate для хранения своих данных, и я использую аннотации для отображения данных в базу данных. Моя проблема в том, что я не знаю, как комментировать мой интерфейс.

кто-нибудь из вас, ребята, использовал составной шаблон при сохранении данных в режиме гибернации

public interface Hierarchy(){
// a few abstract methods that will be implemented by the sub classes
 }


@Entity
@Table()
public class Folder implements Serializable, Hierarchy {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "folder_id", updatable = false, nullable = false)
private int id;
@OneToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER)
@JoinTable(name = "FOLDER_FILELOCATION", joinColumns = { 
        @JoinColumn(name = "folder_id") }, inverseJoinColumns = { 
        @JoinColumn(name = "file_information_id") })
private List<Hierarchy> children = new ArrayList<Hierarchy>() ;
@Column(name = "folder_name")
private String folderName;
@Column(name = "tree_item")
private TreeItem item;
@Column (name = "parent")
private Hierarchy parent;



@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 fiId;
@Column (name = "location")
private String location;
@Column(name = "tree_item")
private TreeItem item;
@Column (name = "parent")
    @ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE} )
    @JoinTable(name="FOLDER_FILELOCATION",
    joinColumns = @JoinColumn(name="filelocation_id"),
    inverseJoinColumns = @JoinColumn(name="folder_ID"))  
private Hierarchy parent;

Ответы [ 3 ]

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

После просмотра документации по гибернации и Эта книга я смог найти решение своей проблемы. я не могу использовать интерфейс на данный момент с аннотациями JPA. поэтому я использовал абстрактный класс с отображениями, которые поддерживают наследование. В этом примере я использую одну таблицу для хранения всех значений. но я посмотрю на то, чтобы разлучить их.

@Entity
@Table(name ="HIERARCHY")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(
    name = "HIERARCHY_TYPE", discriminatorType = DiscriminatorType.STRING)      
public abstract class  Hierarchy implements Serializable {

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



@Entity
@DiscriminatorValue("F")
public class Folder extends Hierarchy  {

@OneToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER)
@JoinTable(name = "FOLDER_JOIN_FILELOCATION", joinColumns = { 
        @JoinColumn(name = "folder_id") }, inverseJoinColumns = { 
        @JoinColumn(name = "file_information_id") })
private List<Hierarchy> children = new ArrayList<Hierarchy>() ;
@Column(name = "folder_name")
private String folderName;
//@Column(name = "tree_item")
//private TreeItem item;
@ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE} )
   @JoinTable(name="FOLDER_JOIN_FOLDER",
        joinColumns = @JoinColumn(name="parent_folder_id"),
        inverseJoinColumns = @JoinColumn(name="folder_ID")
    ) 
private Hierarchy parent;




@Entity
@DiscriminatorValue("FI")
public class FileInformation extends Hierarchy  {


@Column (name = "location")
private String location;
//@Column(name = "tree_item")
//private TreeItem item;
@ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE} )
   @JoinTable(name="FILEINFORMATION_JOIN_FOLDER",
        joinColumns = @JoinColumn(name="filelocation_id"),
        inverseJoinColumns = @JoinColumn(name="folder_ID")
    )  
private Hierarchy parent;
0 голосов
/ 09 апреля 2010

Я не уверен на 100% в том, что вы пытаетесь сделать (вы extending интерфейс, parent отсутствует аннотация @ManyToOne), но, насколько мне известно, интерфейс не поддерживается аннотациями (они не являются частью спецификации JPA). См. HHH-4413 , а также это обсуждение . Для этого вам может потребоваться использовать XML-сопоставления .

0 голосов
/ 09 апреля 2010

Composite - очень базовое отображение спящего режима, и оно не должно быть проблемой.
Но я не понимаю картирование. Я предполагаю, что FOLDER_FILELOCATION является LinkTable между папкой и FileInformation. Если это так, то на самом деле у вас нет отношения OneToMany, но есть отношение к ManyToMany. Но вы можете отобразить его как OneToMany.
С какой точностью вы сталкиваетесь? Чтобы получить более точные ответы, потратьте еще немного времени на объяснение вашей конкретной проблемы. Форматирование данного кода также помогает, но хорошо, я попробую.

Я не совсем уверен, но я думаю, основываясь на модели, я полагаю, у вас есть, вы должны попробовать это:

public interface Hierarchy(){
// a few abstract methods that will be implemented by the sub classes
}


@Entity
@Table(name = "FOLDER_TABLE")
public class Folder  implements Hierarchy, Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "folder_id", updatable = false, nullable = false)
    private int id;

    @OneToMany
    @JoinTable(
            name="FOLDER_FILELOCATION",
            joinColumns = @JoinColumn( name="folder_id"),
            inverseJoinColumns = @JoinColumn( name="filelocation_id")
    )   
    private List<Hierarchy> children = new ArrayList<Hierarchy>() ;

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

    @Column(name = "tree_item")
    private TreeItem item;

    @Column (name = "parent")
    private Hierarchy parent;
}

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

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

    @Column (name = "location")
    private String location;
    @Column(name = "tree_item")
    private TreeItem item;

    @ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE} )
    @JoinTable(name="FOLDER_FILELOCATION",
        joinColumns = @JoinColumn(name="filelocation_id"),
        inverseJoinColumns = @JoinColumn(name="folder_ID")
    )   
    private Hierarchy parent;
}

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...