有关hibernate组合模式的帮助 [英] Help regarding composite pattern with 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屋!