前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >SpringDataJPA笔记(12)-Table注解详解

SpringDataJPA笔记(12)-Table注解详解

作者头像
yingzi_code
发布于 2020-03-25 07:00:10
发布于 2020-03-25 07:00:10
2K00
代码可运行
举报
运行总次数:0
代码可运行

SpringDataJPA笔记(12)-Table注解详解

由于在实际使用中,有时候会遇到需要访问同一台服务器上别的数据库,但是又不想配置多数据源的情况,Table注解给我们提供了这种便利的操作

JPA在根据实体自动生成数据表关联的时候,如果实体类与其映射的数据库表名不同名时,则需要使用到Table注解来标注映射的表名,除此之外还可以指定表所属的数据库目录或模式

首先来看一下Table注解的属性

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Table {
    String name() default "";

    String catalog() default "";

    String schema() default "";

    UniqueConstraint[] uniqueConstraints() default {};

    Index[] indexes() default {};
}

name

name属性用于指定数据库表名称

若不指定则以实体类名称作为表名

例如如下代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Entity
@Table
public class TableEntity extends AnimalEntity<Long> {
}

生成的数据库名为table_entity

catalog

catalog属性用于指定数据库实例名

一般来说数据库实例在数据源配置的时候指定了,不配置就默认使用数据源配置的默认库

如果使用catalog属性设置名称时,若数据库存在和指定名称一致的实例,新创建的表将出现在该实例中

若不存在,则会在启动的时候抛出异常

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 WARN 3304 --- [           main] o.h.t.s.i.ExceptionHandlerLoggedImpl     : GenerationTarget encountered exception accepting command : Error executing DDL "create table aaaadb.table_entity (id bigint not null auto_increment, age integer, gmt_create datetime not null, gmt_update datetime, height integer, name varchar(255), pid bigint, sex varchar(255), weight integer, primary key (id)) engine=InnoDB" via JDBC Statement

org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL "create table aaaadb.table_entity (id bigint not null auto_increment, age integer, gmt_create datetime not null, gmt_update datetime, height integer, name varchar(255), pid bigint, sex varchar(255), weight integer, primary key (id)) engine=InnoDB" via JDBC Statement
	at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:67) ~[hibernate-core-5.4.12.Final.jar:5.4.12.Final]
	at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.applySqlString(AbstractSchemaMigrator.java:559) [hibernate-core-5.4.12.Final.jar:5.4.12.Final]
	at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.applySqlStrings(AbstractSchemaMigrator.java:504) [hibernate-core-5.4.12.Final.jar:5.4.12.Final]
	at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.createTable(AbstractSchemaMigrator.java:277) [hibernate-core-5.4.12.Final.jar:5.4.12.Final]
	at org.hibernate.tool.schema.internal.GroupedSchemaMigratorImpl.performTablesMigration(GroupedSchemaMigratorImpl.java:71) [hibernate-core-5.4.12.Final.jar:5.4.12.Final]
	at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.performMigration(AbstractSchemaMigrator.java:207) [hibernate-core-5.4.12.Final.jar:5.4.12.Final]
	at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.doMigration(AbstractSchemaMigrator.java:114) [hibernate-core-5.4.12.Final.jar:5.4.12.Final]
	at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:184) [hibernate-core-5.4.12.Final.jar:5.4.12.Final]
	at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:73) [hibernate-core-5.4.12.Final.jar:5.4.12.Final]
	at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:314) [hibernate-core-5.4.12.Final.jar:5.4.12.Final]
	at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:468) [hibernate-core-5.4.12.Final.jar:5.4.12.Final]
	at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1237) [hibernate-core-5.4.12.Final.jar:5.4.12.Final]
	at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:58) [spring-orm-5.2.4.RELEASE.jar:5.2.4.RELEASE]
	at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365) [spring-orm-5.2.4.RELEASE.jar:5.2.4.RELEASE]
	at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:391) [spring-orm-5.2.4.RELEASE.jar:5.2.4.RELEASE]
	at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:378) [spring-orm-5.2.4.RELEASE.jar:5.2.4.RELEASE]
	at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341) [spring-orm-5.2.4.RELEASE.jar:5.2.4.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1855) [spring-beans-5.2.4.RELEASE.jar:5.2.4.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1792) [spring-beans-5.2.4.RELEASE.jar:5.2.4.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:595) [spring-beans-5.2.4.RELEASE.jar:5.2.4.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517) [spring-beans-5.2.4.RELEASE.jar:5.2.4.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323) [spring-beans-5.2.4.RELEASE.jar:5.2.4.RELEASE]
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.2.4.RELEASE.jar:5.2.4.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321) [spring-beans-5.2.4.RELEASE.jar:5.2.4.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) [spring-beans-5.2.4.RELEASE.jar:5.2.4.RELEASE]
	at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1108) ~[spring-context-5.2.4.RELEASE.jar:5.2.4.RELEASE]
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:868) ~[spring-context-5.2.4.RELEASE.jar:5.2.4.RELEASE]
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550) ~[spring-context-5.2.4.RELEASE.jar:5.2.4.RELEASE]
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141) ~[spring-boot-2.2.5.RELEASE.jar:2.2.5.RELEASE]
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:747) ~[spring-boot-2.2.5.RELEASE.jar:2.2.5.RELEASE]
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) ~[spring-boot-2.2.5.RELEASE.jar:2.2.5.RELEASE]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) ~[spring-boot-2.2.5.RELEASE.jar:2.2.5.RELEASE]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226) ~[spring-boot-2.2.5.RELEASE.jar:2.2.5.RELEASE]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215) ~[spring-boot-2.2.5.RELEASE.jar:2.2.5.RELEASE]
	at com.mt.demo.jpa.SpringBootJpaDemoApplication.main(SpringBootJpaDemoApplication.java:10) ~[classes/:na]
Caused by: java.sql.SQLSyntaxErrorException: Unknown database 'aaaadb'
	at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120) ~[mysql-connector-java-8.0.19.jar:8.0.19]
	at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) ~[mysql-connector-java-8.0.19.jar:8.0.19]
	at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) ~[mysql-connector-java-8.0.19.jar:8.0.19]
	at com.mysql.cj.jdbc.StatementImpl.executeInternal(StatementImpl.java:764) ~[mysql-connector-java-8.0.19.jar:8.0.19]
	at com.mysql.cj.jdbc.StatementImpl.execute(StatementImpl.java:648) ~[mysql-connector-java-8.0.19.jar:8.0.19]
	at com.zaxxer.hikari.pool.ProxyStatement.execute(ProxyStatement.java:95) ~[HikariCP-3.4.2.jar:na]
	at com.zaxxer.hikari.pool.HikariProxyStatement.execute(HikariProxyStatement.java) ~[HikariCP-3.4.2.jar:na]
	at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:54) ~[hibernate-core-5.4.12.Final.jar:5.4.12.Final]
	... 34 common frames omitted
uniqueConstraints

uniqueConstraints属性用于设定约束条件

例如

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Table(uniqueConstraints={@UniqueConstraint(name = "name_key", columnNames={"name"})})

查看数据库,对应SQL语句

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
UNIQUE KEY `name_key` (`name`)

这里建议指定name属性,以防止在不同情况下生成的name不同,引起一些问题

联合约束

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Table(uniqueConstraints={@UniqueConstraint(name = "name_age_key", columnNames={"name", "age"})})

对应数据库语句

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
UNIQUE KEY `name_age_key` (`name`,`age`)
indexes

表的索引,通过使用 @Index 注解来声明,仅在允许自动更新数据库表结构的场景中起到作用,默认没有其他额外的索引

例如, 默认是不唯一的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Table(indexes={@Index(name = "name_index", columnList="name")})

数据库对应SQL语句

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
KEY `name_index` (`name`)

如果添加了unique = true,则和约束的效果是一样的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Table(indexes={@Index(name = "name_index", columnList="name", unique = true)})

数据库语句为

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
UNIQUE KEY `name_index` (`name`)

联合索引

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Table(indexes={@Index(name = "name_age_index", columnList="name, age", unique = true)})

同样和约束时一样的SQL

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
UNIQUE KEY `name_age_index` (`name`,`age`)
schema

目前schema在mysql中的作用未知,怎么设置好像都没有什么用处,后续有空再研究看看

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
客户端启动报错java.lang.IllegalArgumentException: no server available的解决方案 SpringCloud中 Nacos做注册中心
我的错误就在这里,百度了很久也修改了很多配置 才发现是自己写的有问题; 大家在配置nacos的配置中心的时候 注意写法(很重要)
默 语
2024/11/20
2160
客户端启动报错java.lang.IllegalArgumentException: no server available的解决方案 SpringCloud中 Nacos做注册中心
Error starting ApplicationContext. To display the conditions report re-run your application with
如果你在启动应用时遇到 “Error starting ApplicationContext” 错误,请按照以下步骤重新运行你的应用程序:
猫头虎
2024/04/07
6930
Error starting ApplicationContext. To display the conditions report re-run your application with
springboot启动失败的问题('hibernate.dialect' not set)
springboot版本是1.3.0.M1,连接的mysql版本为8,用spring-boot-starter-data-jpa操做数据库,启动springboot报错如下:
程序员欣宸
2022/05/09
1.1K0
HikariPool-1 – dataSource or dataSourceClassName or jdbcUrl is required.解决方案[通俗易懂]
最近在使用Spring Boot 2.x with H2 Database 以及JPA整合一个项目的时候出现了下面这一个故障:
全栈程序员站长
2022/09/10
4.4K0
SpringDataJPA之快速入门
  Spring Data JPA:Spring Data JPA 是 spring data 项目下的一个模块。提供了一套基于 JPA标准操作数据库的简化方案。底层默认的是依赖 Hibernate JPA 来实现的。   Spring Data JPA 的技术特点:我们只需要定义接口并集成 Spring Data JPA 中所提供的接口就可以了。不需要编写接口实现类。
用户4919348
2019/05/19
5410
springboot+jpa 错误信息org.springframework.beans.factory.BeanCreationException报错信息实体类报错原因
报错信息 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityM
用户5899361
2020/12/07
7050
spring4.1.8扩展实战之二:Aware接口揭秘
Aware.java是个没有定义任何方法的接口,拥有众多子接口,在spring源码中有多处都在使用这些子接口完成各种场景下的回调操作,当业务有需要时,我们只需创建类来实现相关接口,再声明为bean,就可以被spring容器主动回调;
程序员欣宸
2022/05/06
3560
spring4.1.8扩展实战之二:Aware接口揭秘
SpringBoot从1.5.4升级到2.7.2问题总结
编译不报错,启动报错,在springboot1.3版本中会默认提供一个RestTemplate的实例Bean,当在springboot1.4以及以后的版本中,需要手动创建一个RestTemplate的配置,这里将会导致循环依赖
猫头虎
2024/04/08
5880
SpringBoot从1.5.4升级到2.7.2问题总结
两个入门案例带你入门SpringMVC 注解版&&XML版
                1.编写Controller UserController
陶然同学
2023/02/24
4860
两个入门案例带你入门SpringMVC 注解版&&XML版
Spring和SpringDataJpa整合详解
当然还有其他中间件,主流使用的就是Mybatis和Spring-data-jpa。
品茗IT
2019/09/12
5700
java之spring之spring整合hibernate
4.在src下,编写 hibernate.cfg.xml ,并且在cn.vincent.vo下编写vo类的映射文件 User.hbm.xml
Vincent-yuan
2019/09/11
7180
java之spring之spring整合hibernate
Spring 全家桶之 Spring Data JPA(五)
在resource目录下新增applicationContext.xml,新增以下内容
RiemannHypothesis
2022/08/19
2.2K0
Spring 全家桶之 Spring Data JPA(五)
SpringData【Spring整合HibernateJPA】
  现如今的ORM框架还是比较多的比如Hibernate,TopLink以及OpenJPA等等,为了简化ORM框架的使用,JPA随之产生。   JPA是Java Persistence API的简称,中文名Java持久层API,由 Sun 公司提供了一对对于持久层操作的标准(接口+文档),说白了就是在各种ORM框架之上封装了一套API实现统一操作。同时又依赖各种ORM框架去实现。hibernate3.2版本后提供了对JPA的实现。本文就具体来介绍下怎么使用
用户4919348
2019/05/19
7650
SpringBoot启动项目报错:java.lang.UnsatisfiedLinkError: D:\files\software\jdk-15.0.1\jdk-17.0.3.1\bin\tcnat
在网上查了之后有一个说是决定考与tomcat位数不一致: 原贴地址:https://www.cnblogs.com/yuxiaole/p/9247610.html
愷龍
2024/01/28
3494
SpringBoot启动项目报错:java.lang.UnsatisfiedLinkError: D:\files\software\jdk-15.0.1\jdk-17.0.3.1\bin\tcnat
SpringBoot 集成Kotlin : org.hibernate.InstantiationException: No default constructor for entity: : com
正式上架:《Kotlin极简教程》Official on shelves: Kotlin Programming minimalist tutorial 京东JD:https://item.jd.
一个会写诗的程序员
2018/08/17
1.2K0
SpringBoot 整合 SpringDataJPA
  一个 SpringBoot 项目想要使用 SpringDataJPA 必须先添加 SpringDataJPA 相关依赖,其次,SpringDataJPA 会用到数据库驱动,所以也需要导入数据库驱动的依赖
Demo_Null
2020/09/28
7990
SpringBoot 整合 SpringDataJPA
SpringBoot缓存技术整合Ehcache
首先说明一下,这里使用的是Springboot2.2.6.RELEASE版本,由于Springboot迭代很快,所以要注意版本问题。
别先生
2020/05/27
2K0
SpringBoot缓存技术整合Ehcache
springBoot生成SQL文件-Hibernate5的SchemaUpdate实现
之前两篇介绍了使用Hibernate生成SQL全量脚本文件的方式,若需要生成增量脚本进行版本维护呢?想到的对于生成增量脚本的方案可归为:
WindCoder
2020/01/22
1K0
解决:java.lang.AbstractMethodError: null
springboot 2.x 整合 sqlserver 使用 jtds连接池 连数据库的时候出现异常
全栈程序员站长
2022/09/05
1.2K0
Spring 全家桶之 Spring Data JPA(四)
只配置了客户到联系人的关系,查看执行的SQL,相比上一次测试多了一条update外键的sql语句
RiemannHypothesis
2022/08/19
1.7K0
Spring 全家桶之 Spring Data JPA(四)
推荐阅读
相关推荐
客户端启动报错java.lang.IllegalArgumentException: no server available的解决方案 SpringCloud中 Nacos做注册中心
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验