关于如何禁用Hibernate生成外键,网上有使用设置ForeignKey(name="null")方式,使Hibernate不生成外键关联,但是需要在每个关联关系上设置,比较繁琐,很难统一控制保证数据库中不存在外键关联。而且经测试在@JoinColumn设置foreignkey=@ForeignKey(name="null")不会生成外键,在@JoinTable中此种设置方式还是可以生成外键。
下面提供一种禁用Hibernate外键的方式,在创建数据库表时不生成外键关联,但是个人感觉还不是最好的解决方案,希望多多指教。
思路:因为Hibernate为了处理不同数据库SQL的差异,为每个数据库定义了dialect,在执行SQL时会由dialect类的方法中获取相应的SQL,所以可以通过重写dialect类中生成外键SQL的方法不生成数据库外键关联。分别重写的Postgresql数据库和Oracle数据库的Dialect类如下:
import org.hibernate.dialect.PostgreSQL9Dialect; /** * 不生成外键,通过类似于SQL注入的方法,为每个数据库修改创建外键的SQL */ public class PostgreSQL9DialectWithoutFK extends PostgreSQL9Dialect { @Override public String getAddForeignKeyConstraintString( String constraintName, String[] foreignKey, String referencedTable, String[] primaryKey, boolean referencesPrimaryKey) { // 设置foreignkey对应的列值可以为空 return " alter "+ foreignKey[0] +" set default null " ; } }
import org.hibernate.dialect.Oracle10gDialect; /** * 不生成外键,通过类似于SQL注入的方法,为每个数据库修改创建外键的SQL */ public class Oracle10gDialectWithoutFK extends Oracle10gDialect { @Override public String getAddForeignKeyConstraintString( String constraintName, String[] foreignKey, String referencedTable, String[] primaryKey, boolean referencesPrimaryKey) { // 通过修改外键列的默认值,而不是添加外键,避免生成外键 return " modify "+ foreignKey[0] +" default null " ; } }
在重写生成外键SQL时考虑过使用SQL注入的方式在创建完外键后,再删除外键,但是这种方式比较复杂,做了一点后就放弃了。
创建了重写的Dialect类,通过hibernate.dialect=Oracle10gDialectWithoutFK配置后,在生成数据库表时外键策略就会生效。
另:
- 关于是否在数据库中生成外键的讨论如下图,具体的讨论内容可以按关键字搜索相关内容。
- JPA中@JoinColumn不生成外键的配置
- postgresql中alter语法如下
相关推荐
* 9.increnment 插入数据的时候hibernate会给主键添加一个自增的主键,但是一个hibernate实例就维护一个计数器,所以在多个实例运行的时候不能使用这个方法。 * 例:@GeneratedValue(generator = ...
示例应用程序演示了如何将Hibernate用作Spring Data JPA的JPA提供程序。 当前演示了以下概念: 概念 描述 看 Spring Data JPA存储库 使用再次执行操作关系数据库 直接EntityManager访问 直接访问JPA ...
1.4.4 Hibernate、EJB 3和JPA简介 1.5 小结 第2章 启动项目 2.1 启动Hibernate项目 2.1.1 选择开发过程 2.1.2 建立项目 2.1.3 Hibernate配置和启动 2.1.4 运行和测试应用程序 2.2...
这种策略支持双向的一对多关联,但不支持 IDENTIFY 生成器策略,因为ID必须在多个表间共享。一旦使用就不能使用AUTO和IDENTIFY生成器。 每个类层次结构一张表 @Entity @Inheritance(strategy=InheritanceType....
7)可以支持更多的数据库,现在只有mysql和hibernate,由于我不知道如何安装Oracle,所以本系列软件一直不支持Oracle,所以需要一位英雄 8)可有配上更好的前端界面,我现在正视图将前端改成JQuery Easy UI 9)使本软件...
10.2.2 在Java SE环境下使用 Hibernate JPA实现 370 10.2.3 在Java SE环境下使用 TopLink JPA实现 374 10.2.4 在Java SE环境下使用 EntityManager 377 10.2.5 使用orm.xml管理O/R映射 379 10.3 理解实体 382 10.3.1 ...
Hibernate 实体类 生成表结构 ---- 领域(Domain)驱动建模 这次使用的是驱动建模,传统的设计模式是: 先设计表,再创建实体 JPA 注解使用 @Entity 标明是实体类 @Table 映射表名称 @Id 主键标识 @...
10.7.2 反向工程生成Spring整合Hibernate的DAO 184 10.7.3 Spring实现事务自动提交 188 10.8 基于Spring与Struts、Hibernate整合的登录系统 194 10.9 本章小结 199 第11章 JSF框架的开发与应用 200 11.1 JSF框架概述...
2008-07-02 http://beansoft.blogjava.net/ <br><br> MySQL 6 支持外键,视图存储过程,事务等功能(绿色精简版测试通过,支持这些功能),非常方便进行开发(尤其是MyEclipse生成一对多,多对多的Hibernate/JPA映射...