国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Hibernate 自定義表名映射

weij / 876人閱讀

摘要:所以設(shè)計的表名映射格式為,如果不加注解,則將實(shí)體名按照默認(rèn)的生成規(guī)則進(jìn)行生成,如果加了注解,則填寫的就作為表名映射,不進(jìn)行任何處理。云智命名策略實(shí)體與數(shù)據(jù)表名的關(guān)系配置然后將該項(xiàng)配置修改為我們自己建立的實(shí)現(xiàn)類。

問題描述 Hibernate映射介紹

Hibernate中,默認(rèn)的生成關(guān)系是將我們駝峰命名的實(shí)體進(jìn)行拼接下劃線同時轉(zhuǎn)小寫。

這種情況我們可以接受,默認(rèn)的設(shè)置很規(guī)范。

但是這樣,我們在實(shí)體之上聲明了@Table注解,并說我們的表名是Mandatory_Instrument_Apply,但是Hibernate還是將我們的數(shù)據(jù)表映射為小寫加下劃線的形式。這種情況看起來就有些不合理了。

業(yè)務(wù)需求

因?yàn)樾枰嫒堇享?xiàng)目,老項(xiàng)目的數(shù)據(jù)表命名不很很規(guī)范,所以需要用最小的成本實(shí)現(xiàn)數(shù)據(jù)庫的兼容。

所以設(shè)計的表名映射格式為,如果不加@Table注解,則將實(shí)體名按照Hibernate默認(rèn)的生成規(guī)則進(jìn)行生成,如果加了@Table注解,則填寫的name就作為表名映射,不進(jìn)行任何處理。

功能實(shí)現(xiàn) 入門

拋出來一個問題,無從下手。

打開瀏覽器,看看有沒有前人的經(jīng)驗(yàn),GoogleGoogle去發(fā)現(xiàn)找不著啥有價值的信息。但是在StackOverflow上找到一篇引人思索的問題。

Spring boot JPA insert in TABLE with uppercase name with Hibernate - StackOverflow

spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

將這個配置聲明為org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl,就能實(shí)現(xiàn)大寫的轉(zhuǎn)換。

試試再說:

將配置按該問題的回答進(jìn)行修改:

測試一番:

加了@Table注解的,是我們想要的配置,直接映射。那不加注解的呢?

這個又不是我們想要的了,這個注解應(yīng)該是直接將注解中的名或?qū)嶓w名映射到數(shù)據(jù)表,不做任何修改。

發(fā)現(xiàn)新大陸

正當(dāng)一籌莫展之時,再去看一下配置,有了新的領(lǐng)悟。

org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl,這個配置的不就是一個實(shí)現(xiàn)類嗎?我是不是也可以寫一個類然后將我寫的類配置上呢?

點(diǎn)進(jìn)去,發(fā)現(xiàn)不過是一個實(shí)現(xiàn)了PhysicalNamingStrategySerializable兩個接口的類。

看實(shí)現(xiàn)的toPhysicalTableName方法,應(yīng)該就是生成數(shù)據(jù)表名的方法。直接將name返回,這就和我們之前猜想的一致,這個配置是直接將@Table或?qū)嶓w名映射到數(shù)據(jù)表。

YunzhiNamingStrategy

建立配置類YunzhiNamingStrategy.java,云智命名策略,分別實(shí)現(xiàn)上述PhysicalNamingStrategyStandardImpl實(shí)現(xiàn)的兩個接口。同時實(shí)現(xiàn)接口中聲明的方法。

package com.mengyunzhi.demo.config;

import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.boot.model.naming.PhysicalNamingStrategy;
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;

import java.io.Serializable;

/**
 * @author zhangxishuo on 2018/6/15
 * 云智命名策略
 * 實(shí)體與數(shù)據(jù)表名的關(guān)系配置
 */
public class YunzhiNamingStrategy implements PhysicalNamingStrategy, Serializable {
    @Override
    public Identifier toPhysicalCatalogName(Identifier identifier, JdbcEnvironment jdbcEnvironment) {
        return null;
    }

    @Override
    public Identifier toPhysicalSchemaName(Identifier identifier, JdbcEnvironment jdbcEnvironment) {
        return null;
    }

    @Override
    public Identifier toPhysicalTableName(Identifier identifier, JdbcEnvironment jdbcEnvironment) {
        return null;
    }

    @Override
    public Identifier toPhysicalSequenceName(Identifier identifier, JdbcEnvironment jdbcEnvironment) {
        return null;
    }

    @Override
    public Identifier toPhysicalColumnName(Identifier identifier, JdbcEnvironment jdbcEnvironment) {
        return null;
    }
}

然后將該項(xiàng)配置修改為我們自己建立的實(shí)現(xiàn)類。

兼容原配置項(xiàng)

因?yàn)樵摻涌谥杏卸鄠€配置項(xiàng),如:數(shù)據(jù)庫名、字段名等,我們只想修改實(shí)體到數(shù)據(jù)表的命名策略,所以我們找到了另一個實(shí)現(xiàn)PhysicalNamingStrategy命名策略的實(shí)現(xiàn)類:SpringPhysicalNamingStrategy

這就是我們第一次演示的策略,無論添不添加@Table注解,都會映射到小寫的加下劃線的表名。

同時這里的字段映射為小寫下劃線我們是需要保留的,為了代碼的復(fù)用,我們用到了面向?qū)ο蟮睦^承大法。

package com.mengyunzhi.demo.config;

import org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy;

/**
 * @author zhangxishuo on 2018/6/15
 * 云智命名策略
 * 實(shí)體與數(shù)據(jù)表名的關(guān)系配置
 */
public class YunzhiNamingStrategy extends SpringPhysicalNamingStrategy {
    
}

我們對父類中的toPhysicalTableName方法不滿意,Command + N,重寫父類方法。

package com.mengyunzhi.demo.config;

import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;
import org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy;

/**
 * @author zhangxishuo on 2018/6/15
 * 云智命名策略
 * 實(shí)體與數(shù)據(jù)表名的關(guān)系配置
 */
public class YunzhiNamingStrategy extends SpringPhysicalNamingStrategy {
    @Override
    public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment jdbcEnvironment) {
        return super.toPhysicalTableName(name, jdbcEnvironment);
    }
}
注解判斷

我們可以開始我們的邏輯了。

@Table注解的,就按@Table中的名稱中,否則就按Spring默認(rèn)的父類走。

但是問題出現(xiàn)了,Identifier中給我們的名稱就是已經(jīng)處理好的名稱。

Identifier

假如這么寫:

@Entity
public class MandatoryInstrumentApply {
}

那我們的Identifier中的text值就是MandatoryInstrumentApply

@Entity
@Table(name = "Mandatory_Instrument_Apply")
public class MandatoryInstrumentApply {
}

那我們的Identifier中的text值就是Mandatory_Instrument_Apply

Hibernate是把應(yīng)該處理好的名稱告訴我們,但是不會告訴我們這個名稱是實(shí)體的名還是在注解上獲取的。

解決方案

package com.mengyunzhi.demo.config;

import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;
import org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy;

import javax.persistence.Table;

/**
 * @author zhangxishuo on 2018/6/15
 * 云智命名策略
 * 實(shí)體與數(shù)據(jù)表名的關(guān)系配置
 */
public class YunzhiNamingStrategy extends SpringPhysicalNamingStrategy {

    // 定義包名
    private static final String packageName = "com.mengyunzhi.demo.entity.";

    /**
     * 重寫父類生成表名的方法
     */
    @Override
    public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment jdbcEnvironment) {
        try {
            // 獲取實(shí)體類
            Class entityClass = Class.forName(packageName + name.getText());
            // 判斷類上是否有Table注解
            Boolean hasAnnotation = entityClass.isAnnotationPresent(Table.class);
            // 存在Table注解
            if (hasAnnotation) {
                // 獲取Table注解實(shí)例
                Table table = (Table) entityClass.getAnnotation(Table.class);
                // 如果注解中的name字段不為空
                if (!table.name().equals("")) {
                    // 不對名稱進(jìn)行處理
                    return name;
                }
            }
            // 表示這是一個類名,按父類操作進(jìn)行處理
            return super.toPhysicalTableName(name, jdbcEnvironment);
        } catch (ClassNotFoundException e) {
            // 找不到實(shí)體類,說明肯定是@Table注解中的名稱
            return name;
        }
    }
}
測試

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/71208.html

相關(guān)文章

  • 【從零入門系列-2】Spring Boot 之 數(shù)據(jù)庫實(shí)體定義實(shí)現(xiàn)

    摘要:文章系列從零入門系列之從零入門系列之程序結(jié)構(gòu)設(shè)計說明前言本篇文章開始代碼實(shí)踐,系統(tǒng)設(shè)計從底向上展開,因此本篇先介紹如何實(shí)現(xiàn)數(shù)據(jù)庫表實(shí)體類的設(shè)計實(shí)現(xiàn)。主鍵由數(shù)據(jù)庫自動生成主要是自動增長型主鍵由程序控制。 文章系列 【從零入門系列-0】Sprint Boot 之 Hello World 【從零入門系列-1】Sprint Boot 之 程序結(jié)構(gòu)設(shè)計說明 前言 本篇文章開始代碼實(shí)踐,系統(tǒng)...

    nemo 評論0 收藏0
  • Hibernate配置及定義注冊映射文件

    摘要:一配置屬性詳解可以在各式各樣不同環(huán)境下工作而設(shè)計的因此存在著大量的配置參數(shù)。以簡便操作,多數(shù)配置參數(shù)都有默認(rèn)的配置值也是我們?nèi)粘J褂玫谋仨毱贰? Hibernate (開放源代碼的對象關(guān)系映射框架) Hibernate是一個開放源代碼的對象關(guān)系映射框架,它對JDBC進(jìn)行了非常輕量級的對象封裝, 它將POJO與數(shù)據(jù)庫表建立映射關(guān)系,是一個全自動的orm框架,hibernat...

    coordinate35 評論0 收藏0
  • Hibernate 注解使用

    摘要:聲明添加對樂觀鎖定的支持一些屬性關(guān)聯(lián)關(guān)系獲取方式即是否采用延時加載及時加載,是在查詢數(shù)據(jù)時,也直接一起獲取關(guān)聯(lián)對象的數(shù)據(jù)。在前面的基礎(chǔ)上增加課程類并補(bǔ)充學(xué)生類學(xué)生類負(fù)責(zé)關(guān)聯(lián)關(guān)系 Hibernate 注解使用 在Hibernate中通常配置對象關(guān)系映射關(guān)系有兩種,一種是基于xml的方式,另一種是基于Hibernate Annotation庫的注解方式。在Hibernate 3.2版本和J...

    Jinkey 評論0 收藏0
  • Hibernate映射關(guān)系

    摘要:前言首先聲明,這是一篇轉(zhuǎn)發(fā)博客,不屬于原創(chuàng)。關(guān)系映射有下面幾種類型一對一外鍵關(guān)聯(lián)映射單向一對一外鍵關(guān)聯(lián),使用,并設(shè)置了級聯(lián)操作。設(shè)置了外鍵的名稱為數(shù)據(jù)庫字段名,如果不設(shè)置,則默認(rèn)為另一類的屬性名,外鍵的值是唯一的。 前言 首先聲明,這是一篇轉(zhuǎn)發(fā)博客,不屬于原創(chuàng)。但是感覺很有用,所以在本人的博客中記錄下來。 Hibernate Annotation關(guān)系映射有下面幾種類型: 一對一...

    gougoujiang 評論0 收藏0
  • 幾個數(shù)據(jù)持久化框架Hibernate、JPA、Mybatis、JOOQ和JDBC Template的

    摘要:不管是還是,表之間的連接查詢,被映射為實(shí)體類之間的關(guān)聯(lián)關(guān)系,這樣,如果兩個實(shí)體類之間沒有實(shí)現(xiàn)關(guān)聯(lián)關(guān)系,你就不能把兩個實(shí)體或者表起來查詢。 因?yàn)轫?xiàng)目需要選擇數(shù)據(jù)持久化框架,看了一下主要幾個流行的和不流行的框架,對于復(fù)雜業(yè)務(wù)系統(tǒng),最終的結(jié)論是,JOOQ是總體上最好的,可惜不是完全免費(fèi),最終選擇JDBC Template。 Hibernate和Mybatis是使用最多的兩個主流框架,而JOO...

    xietao3 評論0 收藏0

發(fā)表評論

0條評論

weij

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<