[转]JPA(Hibernate)不生成外键

原文地址: http://lpyyn.iteye.com/blog/2180551      

        关于如何禁用Hibernate生成外键,网上有使用设置ForeignKey(name="null")方式,使Hibernate不生成外键关联,但是需要在每个关联关系上设置,比较繁琐,很难统一控制保证数据库中不存在外键关联。而且经测试在@JoinColumn设置foreignkey=@ForeignKey(name="null")不会生成外键,在@JoinTable中此种设置方式还是可以生成外键。 

       下面提供一种禁用Hibernate外键的方式,在创建数据库表时不生成外键关联,但是个人感觉还不是最好的解决方案,希望多多指教。

       思路:因为Hibernate为了处理不同数据库SQL的差异,为每个数据库定义了dialect,在执行SQL时会由dialect类的方法中获取相应的SQL,所以可以通过重写dialect类中生成外键SQL的方法不生成数据库外键关联。分别重写的Postgresql数据库和Oracle数据库的Dialect类如下:

Java代码   收藏代码
  1. import org.hibernate.dialect.PostgreSQL9Dialect;  
  2. /** 
  3.  * 不生成外键,通过类似于SQL注入的方法,为每个数据库修改创建外键的SQL 
  4.  */  
  5. public class PostgreSQL9DialectWithoutFK extends PostgreSQL9Dialect {  
  6.     @Override  
  7.     public String getAddForeignKeyConstraintString(  
  8.             String constraintName,  
  9.             String[] foreignKey,  
  10.             String referencedTable,  
  11.             String[] primaryKey,  
  12.             boolean referencesPrimaryKey) {  
  13. //      设置foreignkey对应的列值可以为空  
  14.         return " alter "+ foreignKey[0] +" set default null " ;  
  15.     }  
  16. }  
Java代码   收藏代码
  1. import org.hibernate.dialect.Oracle10gDialect;  
  2. /** 
  3.  * 不生成外键,通过类似于SQL注入的方法,为每个数据库修改创建外键的SQL 
  4.  */  
  5. public class Oracle10gDialectWithoutFK extends Oracle10gDialect {  
  6.     @Override  
  7.     public String getAddForeignKeyConstraintString(  
  8.             String constraintName,  
  9.             String[] foreignKey,  
  10.             String referencedTable,  
  11.             String[] primaryKey,  
  12.             boolean referencesPrimaryKey) {  
  13. //      通过修改外键列的默认值,而不是添加外键,避免生成外键  
  14.         return " modify "+ foreignKey[0] +" default null " ;  
  15.     }  
  16. }  

       在重写生成外键SQL时考虑过使用SQL注入的方式在创建完外键后,再删除外键,但是这种方式比较复杂,做了一点后就放弃了。

 

       创建了重写的Dialect类,通过hibernate.dialect=Oracle10gDialectWithoutFK配置后,在生成数据库表时外键策略就会生效。

      另:

  • 关于是否在数据库中生成外键的讨论如下图,具体的讨论内容可以按关键字搜索相关内容。


  • JPA中@JoinColumn不生成外键的配置
  • postgresql中alter语法如下

     
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值