【发布时间】:2013-04-14 15:42:58
【问题描述】:
我的应用程序使用 JPA 创建了数据库表。我想使用 JPA 和/或 EclipseLink API(不使用 DROP TABLE 命令)以编程方式删除这些表。
删除JPA框架创建的数据库表的正确方法是什么?
【问题讨论】:
-
类似的,可以参考-stackoverflow.com/a/2731513/366964
标签: database jpa eclipselink
我的应用程序使用 JPA 创建了数据库表。我想使用 JPA 和/或 EclipseLink API(不使用 DROP TABLE 命令)以编程方式删除这些表。
删除JPA框架创建的数据库表的正确方法是什么?
【问题讨论】:
标签: database jpa eclipselink
如果您能够使用 JPA 2.1,则可以指定提供程序写入或读取脚本以删除表,从而允许您控制执行的内容。不幸的是,除非您可以动态编写自己的放置表脚本,否则它不会给您提供精细的控制。
不使用提供程序特定代码,删除特定表的唯一其他方法是本机 SQL。
在 EclipseLink 中,您将从 EntityManager 获取会话并创建一个新的 SchemaManager(会话)。有了它,您可以调用 dropDefaultTables() 删除持久性单元中的所有表,或使用 dropObject(DatabaseObjectDefinition) 删除用于表示表、存储过程等的单个 DatabaseObjectDefinition 对象。您可以使用 getDefaultTableCreator(boolean generateFKConstraints) 来获取PU 的默认表创建者。有了它,您可以使用 getTableDefinitions() 来获取代表 PU 中表的所有 DatabaseObjectDefinition 对象,因此您可以选择一个来删除。
http://wiki.eclipse.org/EclipseLink/FAQ/JPA#How_to_access_table.2C_column_and_schema_information_at_runtime.3F 显示如何打开 EM 以获取会话。
【讨论】:
这对我有用 (EclipseLink JPA 2.1):
EntityManagerFactory emf = Persistence.createEntityManagerFactory("you persistence unit");
EntityManager em = emf.createEntityManager();
SchemaManager sm = new SchemaManager(em.unwrap(DatabaseSession.class));
sm.dropTable("table name");
【讨论】: