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