JPA:从表名中查找类

时间:2013-06-18 17:45:09

标签: inheritance jpa orm

我有一个`documents`表

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。然后我有一个ordersinvoices和其他类似的表格与documents有一对一的关系。文档实体声明连接的继承和派生的订单,发票,...实体使用@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名代表的人都可以为我创建“加入继承”标签,如果他觉得这样做并将其附加到我的问题上吗?非常感谢。

1 个答案:

答案 0 :(得分:1)

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

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

for (ClassDescriptor descriptor : emf.unwrap(Session.class).getDescriptors().values()) {
  Class entityClass = descriptor.getJavaClass();
  List<String> tables = descriptors.getTableNames();
}