有关hibernate组合模式的帮助 [英] Help regarding composite pattern with hibernate

查看:120
本文介绍了有关hibernate组合模式的帮助的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

所以我被卡住了,我正在创建一个gwt web应用程序,我将使用树(gwt树和TreeItems)结构来显示文件夹(类文件夹)和文件(类FileLocation)的列表,文件夹和文件位置类都将实现基于复合模式类的Hierarchy接口。但我使用Hibernate来存储我的数据,并且我使用注释来将数据映射到数据库。我的麻烦是我不知道如何注释我的界面。

有你们中的任何一个人在使用hibernate持久化数据时使用了复合模式

  public interface Hierarchy(){
//将由子类实现的几个抽象方法
}


@Entity
@Table()
public class Folder实现Serializable,Hierarchy {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name =folder_id,可更新= 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)
私人TreeItem项目;
@Column(name =parent)
私有层次结构parent;




$ b @Entity
@Table(name =FILE_INFORMATION_TABLE)
public class FileInformation实现可序列化,层次结构{

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name =file_information_id,updatable = false,nullable = false)
private int fiId;
@Column(name =location)
私人字符串位置;
@Column(name =tree_item)
私人TreeItem项目;
@Column(name =parent)
@ManyToOne(cascade = {CascadeType.PERSIST,CascadeType.MERGE})
@JoinTable(name =FOLDER_FILELOCATION,
joinColumns = @JoinColumn(name =filelocation_id),
inverseJoinColumns = @JoinColumn(name =folder_ID))
private parent Hierarchy parent;


解决方案

在浏览hibernate文档和本书我能找到解决我的问题的方法。使用JPA批注时,我无法使用接口。所以我使用了支持继承的映射的抽象类。在这个例子中,我使用单个表来存储所有的值。但我会仔细分析它们。

  @Entity 
@Table(name =HIERARCHY)
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)@DiscriminatorColumn(
name =HIERARCHY_TYPE,discriminatorType = DiscriminatorType.STRING)
公共抽象类Hierarchy实现Serializable {

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



@实体
@DiscriminatorValue(F)
公共类文件夹扩展层次结构{

@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)
//私人TreeItem项目;
@ManyToOne(cascade = {CascadeType.PERSIST,CascadeType.MERGE})
@JoinTable(name =FOLDER_JOIN_FOLDER,
joinColumns = @JoinColumn(name =parent_folder_id),
inverseJoinColumns = @JoinColumn(name =folder_ID)

私有层次结构parent;




@实体
@ DiscriminatorValue(FI)
公共类FileInformation扩展层次结构{


@Column(name =location)
私人字符串位置;
// @ Column(name =tree_item)
//私人TreeItem项目;
@ManyToOne(cascade = {CascadeType.PERSIST,CascadeType.MERGE})
@JoinTable(name =FILEINFORMATION_JOIN_FOLDER,
joinColumns = @JoinColumn(name =filelocation_id),
inverseJoinColumns = @JoinColumn(name =folder_ID)

私有层次结构parent;


So i am stuck, i am creating a gwt web application, i will be using a tree(gwt Tree and TreeItems) structure to show a list of folders(class Folder) and files(class FileLocation), the folder and filelocation class will all implement a Hierarchy interface basing the classes on the composite pattern. but i am using hibernate to store my data , and i am using annotations for the mapping of the data to the database. my trouble is i do not know how to annotate my interface.

have any of you guys used the composite pattern while persisting the data with 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;

解决方案

After a look through the hibernate documentation and This Book i was able to find a solution to my problem. i cannot use an interface for the moment with JPA annotations. so i used an abstract class with mappings that supported inheritance. in this example i use a single table to store all the values. but i wil look in to seperating them.

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

这篇关于有关hibernate组合模式的帮助的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆