关于如何禁用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语法如下
相关推荐
其中,`spring.jpa.hibernate.ddl-auto`属性决定了数据库的自动管理策略,`update`表示启动时更新已有表结构,如果表不存在则创建。 3. **创建实体类** 创建Java类作为数据库表的映射,使用`@Entity`注解标记,...
使用IDE如IntelliJ IDEA或Eclipse,可以利用其强大的代码提示和生成功能,方便地处理JPA和Hibernate的继承注解。此外,像Hibernate Tools这样的工具可以帮助生成映射文件和数据库表结构,简化开发过程。 总之,...
本主题主要围绕"spring jpa操作数据库 级联数据 hibernate"展开,探讨如何利用Spring JPA进行数据库交互,并涉及到级联操作和与Hibernate的集成。 Spring JPA是Spring对Java Persistence API的一个封装,它提供了...
对于MySQL数据库,Middlegen通常会处理诸如表名、字段、主键、外键等信息,将其转换为符合Hibernate规范的XML格式。 在Middlegen-Hibernate-r5这个压缩包中,用户可以找到Middlegen针对Hibernate r5版本优化的版本...
XDoclet是早期的一个工具,用于自动生成Hibernate的映射文件(.hbm.xml)和SQL语句,这样开发者无需手动编写这些文件,提高了开发效率。这篇博客文章“Hibernate使用xdoclet生成映射文件和sql语句”可能详细介绍了...
### JPA与Hibernate注解详解 #### 一、引言 Java Persistence API (JPA) 是一种用于管理Java应用程序中的关系数据的标准规范。它提供了一种面向对象的方式来处理数据库记录,使得开发人员能够更容易地与数据库进行...
可以通过`@JoinColumn`避免中间表的生成,并指定外键名。 3. **加载策略:** `@ManyToOne`默认使用立即加载,`@OneToMany`默认使用懒加载。 **示例代码:** ```java @ManyToOne(fetch = FetchType.EAGER) @...
示例应用程序演示了如何将Hibernate用作Spring Data JPA的JPA提供程序。 当前演示了以下概念: 概念 描述 看 Spring Data JPA存储库 使用再次执行操作关系数据库 直接EntityManager访问 直接访问JPA ...
- **兼容性**: 在使用JPA开发的应用中,仍然会用到如Hibernate这样的ORM框架,但这些应用可以在不修改代码的情况下在任何支持JPA的环境中运行。 - **区别与联系**: JPA规定了标准接口和行为,而实际的实现是由如...
本篇文章将深入讲解如何使用Hibernate 4.2.4,一个流行的JPA实现,来搭建JPA开发环境,并结合提供的`JpaDemo1`源代码进行分析。 首先,我们需要了解JPA的基本概念。JPA允许我们通过面向对象的方式来操作数据库,将...
在应用配置中指定数据源、JPA供应商(如Hibernate)及相关的属性设置。 2.3 测试配置 编写测试代码验证JPA的配置是否生效,确保可以正常进行数据库操作。 2.4 环境搭建附表 列出完整的环境配置信息,如数据库连接...
- **描述**:`@Transient` 注解用于标记一个属性不映射到数据库。 - **用途**:通常用于存储非持久化的属性,例如计算属性。 #### 8. `@ManyToOne` 和 `@JoinColumn` - **描述**: - `@ManyToOne`:用于表示多对...
本文将详细解读 JPA 注解的基本用法,并通过 Hibernate 框架作为实现 JPA 规范的具体例子。 #### 1. @Entity - **用途**:`@Entity` 注解用来标记一个 Java 类作为 JPA 的实体类,它可以映射到数据库的一个表。 - ...
`generator`用来指定主键生成器,比如在Hibernate中可以指定uuid等生成方式。 5. **@Basic(fetch=FetchType, optional=true)**:表示一个简单的属性到数据库表字段的映射。`fetch`决定了字段的加载策略,EAGER表示...
在这个例子中,`User`实体映射到`users`表,`email`字段是主键且唯一,`password`字段不允许为空,`role`字段通过外键`role_id`与`Role`实体建立多对一的关系。 ### **四、操作数据库** 使用JPA提供的Repository...
JPA的广泛使用得益于其与Hibernate等持久化框架的兼容性,因此在使用JPA时,Hibernate往往被用来提供底层的数据持久化实现。 在实际应用中,开发者可以通过阅读JPA规范文档以及使用注解和XML配置文件来实现各种复杂...
在项目中使用JPA,需要添加相应的依赖,如Spring Data JPA,以及JPA供应商,如Hibernate。配置文件中要指定数据源、实体扫描路径、JPA属性等。通过测试类验证配置是否正确。 3. 常用注解 JPA提供了丰富的注解,用于...
1. 支持JPA 2.0规范:此版本引入了更多的JPA标准注解,如@Inheritance、@SequenceGenerator等,增强了与Java Persistence API的兼容性。 2. 性能优化:3.4.0.GA版本针对查询性能和内存使用进行了优化,提升了整体...
Hibernate支持多种主键生成策略,包括但不限于: - **increment**:由Hibernate负责自增长。 - **identity**:基于数据库的自增策略。 - **sequence**:基于Oracle等数据库的序列。 - **native**:根据数据库类型...
7. **JPA(Java Persistence API)兼容**:Hibernate 5.0不仅作为一个独立的ORM框架,还完全兼容JPA标准,使得开发者可以选择使用JPA的API进行操作。 8. **Transaction Management**:Hibernate支持JTA(Java ...