`

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

    博客分类:
  • JPA
 
阅读更多

原文地址: 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语法如下

     
分享到:
评论

相关推荐

    springboot集成jpa代码,自动生成表

    其中,`spring.jpa.hibernate.ddl-auto`属性决定了数据库的自动管理策略,`update`表示启动时更新已有表结构,如果表不存在则创建。 3. **创建实体类** 创建Java类作为数据库表的映射,使用`@Entity`注解标记,...

    jpa/hibernate继承注解

    使用IDE如IntelliJ IDEA或Eclipse,可以利用其强大的代码提示和生成功能,方便地处理JPA和Hibernate的继承注解。此外,像Hibernate Tools这样的工具可以帮助生成映射文件和数据库表结构,简化开发过程。 总之,...

    Hibernate关系映射XML生成工具

    此外,随着技术的发展,许多现代ORM框架如JPA和Spring Data JPA提供了更高级的抽象,可以完全摆脱XML映射,转而使用注解来描述对象关系映射。 总的来说,"Middlegen-Hibernate-r5"是面向Hibernate用户的一款实用...

    spring jpa操作数据库 级联数据 hibernate

    本主题主要围绕"spring jpa操作数据库 级联数据 hibernate"展开,探讨如何利用Spring JPA进行数据库交互,并涉及到级联操作和与Hibernate的集成。 Spring JPA是Spring对Java Persistence API的一个封装,它提供了...

    Hibernate使用xdoclet生成映射文件和sql语句

    XDoclet是早期的一个工具,用于自动生成Hibernate的映射文件(.hbm.xml)和SQL语句,这样开发者无需手动编写这些文件,提高了开发效率。这篇博客文章“Hibernate使用xdoclet生成映射文件和sql语句”可能详细介绍了...

    JPA -amp Hibernate 注解

    ### JPA与Hibernate注解详解 #### 一、引言 Java Persistence API (JPA) 是一种用于管理Java应用程序中的关系数据的标准规范。它提供了一种面向对象的方式来处理数据库记录,使得开发人员能够更容易地与数据库进行...

    hibernate常见异常针对于jpa

    可以通过`@JoinColumn`避免中间表的生成,并指定外键名。 3. **加载策略:** `@ManyToOne`默认使用立即加载,`@OneToMany`默认使用懒加载。 **示例代码:** ```java @ManyToOne(fetch = FetchType.EAGER) @...

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

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

    JPA学习文档笔记

    - **兼容性**: 在使用JPA开发的应用中,仍然会用到如Hibernate这样的ORM框架,但这些应用可以在不修改代码的情况下在任何支持JPA的环境中运行。 - **区别与联系**: JPA规定了标准接口和行为,而实际的实现是由如...

    JPA环境搭建源代码

    本篇文章将深入讲解如何使用Hibernate 4.2.4,一个流行的JPA实现,来搭建JPA开发环境,并结合提供的`JpaDemo1`源代码进行分析。 首先,我们需要了解JPA的基本概念。JPA允许我们通过面向对象的方式来操作数据库,将...

    JPA学习笔记

    在应用配置中指定数据源、JPA供应商(如Hibernate)及相关的属性设置。 2.3 测试配置 编写测试代码验证JPA的配置是否生效,确保可以正常进行数据库操作。 2.4 环境搭建附表 列出完整的环境配置信息,如数据库连接...

    JPA注解总结

    本文将详细解读 JPA 注解的基本用法,并通过 Hibernate 框架作为实现 JPA 规范的具体例子。 #### 1. @Entity - **用途**:`@Entity` 注解用来标记一个 Java 类作为 JPA 的实体类,它可以映射到数据库的一个表。 - ...

    JPA注解详细解释、EJB3、 Hibernate开发

    - **描述**:`@Transient` 注解用于标记一个属性不映射到数据库。 - **用途**:通常用于存储非持久化的属性,例如计算属性。 #### 8. `@ManyToOne` 和 `@JoinColumn` - **描述**: - `@ManyToOne`:用于表示多对...

    JPA学习笔记(高手笔记录)

    在项目中使用JPA,需要添加相应的依赖,如Spring Data JPA,以及JPA供应商,如Hibernate。配置文件中要指定数据源、实体扫描路径、JPA属性等。通过测试类验证配置是否正确。 3. 常用注解 JPA提供了丰富的注解,用于...

    JPA注解说明 详解

    `generator`用来指定主键生成器,比如在Hibernate中可以指定uuid等生成方式。 5. **@Basic(fetch=FetchType, optional=true)**:表示一个简单的属性到数据库表字段的映射。`fetch`决定了字段的加载策略,EAGER表示...

    JPA环境搭建及基础映射

    在这个例子中,`User`实体映射到`users`表,`email`字段是主键且唯一,`password`字段不允许为空,`role`字段通过外键`role_id`与`Role`实体建立多对一的关系。 ### **四、操作数据库** 使用JPA提供的Repository...

    JPA2映射的神秘之旅

    JPA的广泛使用得益于其与Hibernate等持久化框架的兼容性,因此在使用JPA时,Hibernate往往被用来提供底层的数据持久化实现。 在实际应用中,开发者可以通过阅读JPA规范文档以及使用注解和XML配置文件来实现各种复杂...

    hibernate-annotations-3.4.0.GA

    1. 支持JPA 2.0规范:此版本引入了更多的JPA标准注解,如@Inheritance、@SequenceGenerator等,增强了与Java Persistence API的兼容性。 2. 性能优化:3.4.0.GA版本针对查询性能和内存使用进行了优化,提升了整体...

    hibernate框架笔记

    Hibernate支持多种主键生成策略,包括但不限于: - **increment**:由Hibernate负责自增长。 - **identity**:基于数据库的自增策略。 - **sequence**:基于Oracle等数据库的序列。 - **native**:根据数据库类型...

    hibernate5.0jar包

    7. **JPA(Java Persistence API)兼容**:Hibernate 5.0不仅作为一个独立的ORM框架,还完全兼容JPA标准,使得开发者可以选择使用JPA的API进行操作。 8. **Transaction Management**:Hibernate支持JTA(Java ...

Global site tag (gtag.js) - Google Analytics