Java的休眠/ JPA如何创建动态通用实体的,自相关 [英] Java hibernate/jpa how to create dynamic generic entity that is self related

查看:248
本文介绍了Java的休眠/ JPA如何创建动态通用实体的,自相关的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想创建JPA /休眠将延长像每个层次结构模型动态和通用超:角色页,目录,部门,权限,树。
我想用递归和Java反射与此对象动态树创建

它看起来应该是这样的:

这个实体应参照自身的实体。

我想它是完全抽象的,没有数据库表。只有extendet enities应有分贝。<​​/ P>

我试过才达到这一点。但不能这么久。 <一href=\"http://stackoverflow.com/questions/27101716/apply-generic-class-mappedsuperclass-as-targetentity-error-manytoone-on-model\">Here是我的一篇关于它

我考虑的解决方案:


  • @Inheritance(策略= InheritanceType.TABLE_PER_CLASS)

  • @Any和@AnyMetaDef映射

  • @MappedSuperclass

  • @Embeddable @Embedded和

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


解决方案

我想出了以下设计。您还可以检查它的 GitHub上

  @MappedSuperclass
公共抽象类GenericHierarchicalDictionary {    公共抽象GenericHierarchicalDictionary的getParent();    公共抽象集合&LT ;?扩展GenericHierarchicalDictionary&GT;的getChildren();}@实体
@Table(NAME =LocalFolder)
公共类LocalFolder扩展GenericHierarchicalDictionary {    @ID
    @GeneratedValue(策略= GenerationType.IDENTITY)
    私人长期身份证;    @ManyToOne
    私人LocalFolder父母;    @OneToMany(的mappedBy =父)
    私人设置&LT; LocalFolder&GT;孩子=新的HashSet&LT; LocalFolder&GT;();    @覆盖
    公共LocalFolder的getParent(){
        回到父母;
    }    @覆盖
    公开组&LT; LocalFolder&GT;的getChildren(){
        返回儿童;
    }    公共无效的addChild(LocalFolder localFolder){
        localFolder.parent =这一点;
        children.add(localFolder);
    }
}@实体
@Table(NAME =RemoteFolder)
公共类RemoteFolder扩展GenericHierarchicalDictionary {    @ID
    @GeneratedValue(策略= GenerationType.IDENTITY)
    私人长期身份证;    @ManyToOne
    私人RemoteFolder父母;    @OneToMany(的mappedBy =父)
    私人设置&LT; RemoteFolder&GT;孩子=新的HashSet&LT; RemoteFolder&GT;();    @覆盖
    公共RemoteFolder的getParent(){
        回到父母;
    }    @覆盖
    公开组&LT; RemoteFolder&GT;的getChildren(){
        返回儿童;
    }    公共无效的addChild(RemoteFolder localFolder){
        localFolder.parent =这一点;
        children.add(localFolder);
    }
}

这是测试:

  @Test
公共无效testTree(){
    LOGGER.debug(testAddWebResource);
    doInTransaction(新TransactionCallable&LT;无效&GT;(){
        @覆盖
        公共无效执行(会话的会话){
            LocalFolder rootLocalFolder =新LocalFolder();
            session.persist(rootLocalFolder);
            LocalFolder localFolder1 =新LocalFolder();
            rootLocalFolder.addChild(localFolder1);
            session.persist(localFolder1);
            LocalFolder localFolder11 =新LocalFolder();
            localFolder1.addChild(localFolder11);
            session.persist(localFolder11);            RemoteFolder rootRemoteFolder =新RemoteFolder();
            session.persist(rootRemoteFolder);
            RemoteFolder remoteFolder1 =新RemoteFolder();
            rootRemoteFolder.addChild(remoteFolder1);
            session.persist(remoteFolder1);
            RemoteFolder remoteFolder11 =新RemoteFolder();
            remoteFolder1.addChild(remoteFolder11);
            session.persist(remoteFolder11);
            返回null;
        }
    });
}

I would like to create dynamic and generic superclass with JPA/hibernate that will be extended for each hierarchical structured model like: role, page, directory, department, permission, tree. I would like to create with this object dynamic tree using recursion and java reflection

it should look this way:

This entity should have reference to self entity.

I would like it to be completely abstract and had no db table. Only extendet enities should have db.

I've tried to achive this. But fail so long. Here is my post about it

I consider solutions:

  • @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
  • @Any and @AnyMetaDef mappings
  • @MappedSuperclass
  • @Embeddable and @Embedded

I hope someone will give some suggestions.

解决方案

I came up with the following design. You can also check it on GitHub:

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

And this is the test:

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

这篇关于Java的休眠/ JPA如何创建动态通用实体的,自相关的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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