我想使用 JPA/hibernate 创建动态和通用的超类,它将针对每个层次结构模型进行扩展,例如:角色、页面、目录、部门、权限、树。
我想使用递归和java反射来创建这个对象动态树
它应该看起来像这样:
该实体应该引用自身实体。
我希望它是完全抽象的并且没有数据库表。只有扩展实体才应该有 db.
我已经尝试实现这一目标。但失败了这么久。这是我关于它的帖子 https://stackoverflow.com/questions/27101716/apply-generic-class-mappedsuperclass-as-targetentity-error-manytoone-on-model
我考虑的解决方案:
- @Inheritance(策略 = InheritanceType.TABLE_PER_CLASS)
- @Any 和 @AnyMetaDef 映射
- @MappedSuperclass
- @Embeddable 和 @Embedded
我希望有人能给一些建议。
我想出了以下设计。您还可以检查一下GitHub https://github.com/vladmihalcea/hibernate-master-class/blob/master/core/src/test/java/com/vladmihalcea/hibernate/masterclass/laboratory/inheritance/TreeTest.java:
@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;
}
});
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)