Java hibernate/jpa如何创建自相关的动态通用实体

Java hibernate/jpa如何创建自相关的动态通用实体,java,hibernate,recursion,tree,annotations,Java,Hibernate,Recursion,Tree,Annotations,我想用JPA/hibernate创建动态的、通用的超类,该超类将针对每个层次结构模型进行扩展,如:角色、页面、目录、部门、权限、树。 我想使用递归和java反射创建这个对象动态树 应该这样看: 此实体应具有对自身实体的引用 我希望它是完全抽象的,没有db表。只有extendet enities应该有db 我试着做到这一点。但是失败太久了 我考虑解决方案: @继承(策略=继承类型。每个类的表) @Any和@AnyMetaDef映射 @映射超类 @可嵌入和@Embedded 我希望有人能给我一

我想用JPA/hibernate创建动态的、通用的超类,该超类将针对每个层次结构模型进行扩展,如:角色、页面、目录、部门、权限、树。 我想使用递归和java反射创建这个对象动态树

应该这样看:

此实体应具有对自身实体的引用

我希望它是完全抽象的,没有db表。只有extendet enities应该有db

我试着做到这一点。但是失败太久了

我考虑解决方案:

  • @继承(策略=继承类型。每个类的表)
  • @Any和@AnyMetaDef映射
  • @映射超类
  • @可嵌入和@Embedded

我希望有人能给我一些建议。

我提出了以下设计。您还可以在以下位置进行检查:

@MappedSuperclass

公共抽象类GenericHierarchicalDictionary{
公共摘要GenericHierarchicalDictionary getParent();
公共抽象集我已经检查了你的解决方案。它很好。但是我想把所有常用的方法,比如(getParent(),addChild())在抽象方法中:
genericierarchicaldictionary
。当我将该方法和参数放入
genericierarchicaldictionary
时,我得到一个错误:
rg.hibernate.AnnotationException:@OneToOne或@ManyToOne on models.LocalFolder.parent引用未知实体:models.genericierarchicaldictionary
好吧,Hibernate有它的局限性,这就是为什么你必须在实际的实现类中显式地声明依赖关系。总之,继承对于行为比重用数据结构更有意义。好吧。那么让我们在像LocalFolder这样的具体类中声明数据结构。但是我们可以移动获取父类的方法吗,chil德伦,树形结构的抽象化方法(带反射?)?我试着让泛型DAO像其他许多DAO一样,但从来没有看到GenericDaoGenericHierarchicalDictionary中的数据结构同时定义了getParent和getChildren。因此基类定义了契约,这意味着你不必使用反射。你也可以在基类中定义addChild和setParent。我如何声明主体在抽象基类中使用此方法?在我的所有应用程序中,我都是这样做的。将公共实体扩展到每个子级并使用该实体。您能更精确一点吗?您能给我更多详细信息吗?代码?
@MappedSuperclass
public abstract class GenericHierarchicalDictionary {

    public abstract GenericHierarchicalDictionary getParent();

    public abstract Set<? extends GenericHierarchicalDictionary> getChildren();

}

@Entity
@Table(name = "LocalFolder")
public class LocalFolder extends GenericHierarchicalDictionary {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;

    @ManyToOne
    private LocalFolder parent;

    @OneToMany(mappedBy = "parent")
    private Set<LocalFolder> children = new HashSet<LocalFolder>();

    @Override
    public LocalFolder getParent() {
        return parent;
    }

    @Override
    public Set<LocalFolder> getChildren() {
        return children;
    }

    public void addChild(LocalFolder localFolder) {
        localFolder.parent = this;
        children.add(localFolder);
    }
}

@Entity
@Table(name = "RemoteFolder")
public class RemoteFolder extends GenericHierarchicalDictionary {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;

    @ManyToOne
    private RemoteFolder parent;

    @OneToMany(mappedBy = "parent")
    private Set<RemoteFolder> children = new HashSet<RemoteFolder>();

    @Override
    public RemoteFolder getParent() {
        return parent;
    }

    @Override
    public Set<RemoteFolder> getChildren() {
        return children;
    }

    public void addChild(RemoteFolder localFolder) {
        localFolder.parent = this;
        children.add(localFolder);
    }
}
@Test
public void testTree() {
    LOGGER.debug("testAddWebResource");
    doInTransaction(new TransactionCallable<Void>() {
        @Override
        public Void execute(Session session) {
            LocalFolder rootLocalFolder = new LocalFolder();
            session.persist(rootLocalFolder);
            LocalFolder localFolder1 = new LocalFolder();
            rootLocalFolder.addChild(localFolder1);
            session.persist(localFolder1);
            LocalFolder localFolder11 = new LocalFolder();
            localFolder1.addChild(localFolder11);
            session.persist(localFolder11);

            RemoteFolder rootRemoteFolder = new RemoteFolder();
            session.persist(rootRemoteFolder);
            RemoteFolder remoteFolder1 = new RemoteFolder();
            rootRemoteFolder.addChild(remoteFolder1);
            session.persist(remoteFolder1);
            RemoteFolder remoteFolder11 = new RemoteFolder();
            remoteFolder1.addChild(remoteFolder11);
            session.persist(remoteFolder11);
            return null;
        }
    });
}