0

我有一个“文档”表

CREATE TABLE `documents` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`docnum` int(11) default null,
`docdate` DATE default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 

和相应的文档@Entity。然后我有一个orders,invoices和其他类似的表,它们与documents. Documents 实体声明联合继承和派生的 Orders、Invoices、... 实体使用 @PrimaryKeyJoinColumn。一切都按预期工作。

然后我有一个表,它在各种文档类型之间建立了一些弱关系:

CREATE TABLE IF NOT EXISTS `documents_xref` (
  `id` int(11) not null auto_increment primary key,
  `xrefdate` DATE not null,
  `src_doc` int(11) not null,
  `src_doc_tablename` VARCHAR(250) not null,
  `dst_doc` int(11) not null unique,
  `dst_doc_tablename` VARCHAR(250) not null,
  INDEX(`src_doc`),
  CONSTRAINT FOREIGN KEY (`src_doc`) REFERENCES `documents` (`id`),
  CONSTRAINT FOREIGN KEY (`dst_doc`) REFERENCES `documents` (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 ;

现在我需要显示一个文档之间的关系图,并且图的每个节点都必须告诉它是什么类型的文档,这样我就需要从表名中找到@Entity 类。除了蛮力之外,还有其他方法可以从 JPA2 获得它吗?

附带说明:如果他愿意,任何拥有 1500 代表的人都可以为我创建“联合继承”标签并将其附加到我的问题中吗?非常感谢。

4

1 回答 1

1

这将是特定于提供者的,因为您需要访问内部 JPA 元数据,除非您自己处理所有注释/xml,或者在表和类之间定义自己的硬编码映射。

对于 EclipseLink,您可以从 EntityManagerFactory 解包 EclipseLink 会话并访问所有描述符。

for (ClassDescriptor descriptor : emf.unwrap(Session.class).getDescriptors().values()) {
  Class entityClass = descriptor.getJavaClass();
  List<String> tables = descriptors.getTableNames();
}
于 2013-06-19T12:48:46.467 回答