【问题标题】:Help regarding composite pattern with hibernate关于hibernate复合模式的帮助
【发布时间】:2010-04-08 21:58:33
【问题描述】:

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

你们中的任何人在使用 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;

【问题讨论】:

    标签: java database hibernate gwt annotations


    【解决方案1】:

    在查看了休眠文档和This Book 之后,我找到了解决问题的方法。我暂时无法使用带有 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;
    

    【讨论】:

      【解决方案2】:

      Composite 是非常基本的休眠映射,应该不是问题。
      但我不明白映射。我假设 FOLDER_FILELOCATION 是文件夹和文件信息之间的链接表。如果是这样,您实际上没有 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;
      }
      

      希望这会有所帮助。

      【讨论】:

      • Initial SessionFactory creation failed.org.hibernate.AnnotationException: @OneToOne or @ManyToOne on com.example.client.FileInformation.parent 引用未知实体:com.example.client.Hierarchy 我收到此错误您的实现与我得到的相同。我必须对界面进行注释,但我不知道该怎么做另外我将 FOLDER_FILELOCATION 更改为 FOLDER_JOIN_FILELOCATION!
      【解决方案3】:

      我不能 100% 确定你想要做什么(你是 extending 一个接口,parent 缺少一个 @ManyToOne 注释)但据我所知,接口不受支持通过注释(它们不是 JPA 规范的一部分)。请参阅HHH-4413this discussion。为此,您可能需要使用 XML mappings

      【讨论】:

      • 对不起,我正在使用 Hierarchy 作为抽象类进行测试,并复制并粘贴了代码。我修好了
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多