`
lp895876294
  • 浏览: 279722 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

JPA(Hibernate)不生成外键

    博客分类:
  • JPA
 
阅读更多

       关于如何禁用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语法如下

     

 

  • 大小: 136.9 KB
  • 大小: 752.1 KB
  • 大小: 208.2 KB
分享到:
评论
3 楼 213539 2016-09-20  
我TM为这个问题纠结了一天...
感谢楼主~
不过正在纠结是通过注解方式,还是重写Dialect
2 楼 lp895876294 2015-12-01  
hailinliu 写道
楼主,你重写了Oracle10gDialectWithoutFK ,如何配置程序应用此类呢?

通过hibernate的属性配置
1 楼 hailinliu 2015-11-26  
楼主,你重写了Oracle10gDialectWithoutFK ,如何配置程序应用此类呢?

相关推荐

    Hibernate注解

    * 9.increnment 插入数据的时候hibernate会给主键添加一个自增的主键,但是一个hibernate实例就维护一个计数器,所以在多个实例运行的时候不能使用这个方法。 * 例:@GeneratedValue(generator = ...

    spring-jpa-hibernate:使用Spring Data JPA和Hibernate作为JPA提供者的示例应用程序

    示例应用程序演示了如何将Hibernate用作Spring Data JPA的JPA提供程序。 当前演示了以下概念: 概念 描述 看 Spring Data JPA存储库 使用再次执行操作关系数据库 直接EntityManager访问 直接访问JPA ...

    Hibernate实战(第2版 中文高清版)

     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...

    Hibernate注释大全收藏

    这种策略支持双向的一对多关联,但不支持 IDENTIFY 生成器策略,因为ID必须在多个表间共享。一旦使用就不能使用AUTO和IDENTIFY生成器。 每个类层次结构一张表 @Entity @Inheritance(strategy=InheritanceType....

    无垠式代码生成器0.8最新全部源码开源了

    7)可以支持更多的数据库,现在只有mysql和hibernate,由于我不知道如何安装Oracle,所以本系列软件一直不支持Oracle,所以需要一位英雄 8)可有配上更好的前端界面,我现在正视图将前端改成JQuery Easy UI 9)使本软件...

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    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 ...

    BOS 技术整理

    Hibernate 实体类 生成表结构 ---- 领域(Domain)驱动建模 这次使用的是驱动建模,传统的设计模式是: 先设计表,再创建实体 JPA 注解使用 @Entity 标明是实体类 @Table 映射表名称 @Id 主键标识 @...

    JAVA程序开发大全---上半部分

    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框架概述...

    MySQL 6 绿色精简BAT版 2.24 MB

    2008-07-02 http://beansoft.blogjava.net/ <br><br> MySQL 6 支持外键,视图存储过程,事务等功能(绿色精简版测试通过,支持这些功能),非常方便进行开发(尤其是MyEclipse生成一对多,多对多的Hibernate/JPA映射...

Global site tag (gtag.js) - Google Analytics