精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Spring Jpa這個問題怎么解決?

開發(fā) 前端
spring jpa是基于Habernate實現(xiàn),同樣我們需要基于接口org.hibernate.integrator.spi.Integrator,在生成ddl時進行擴展。

在使用spring-boot-starter-data-jpa時,通過這樣的配置可以在程序啟動后實現(xiàn)在指定數(shù)據(jù)庫自動建表。

spring:
  jpa:
    hibernate:
      ddl-auto: update

但是這種方式建表后沒辦法為每一列增加對應的中文注釋,有什么辦法可以實現(xiàn)這一需求呢?

后面在網(wǎng)上找到了實現(xiàn)方法:

<dependency>
            <groupId>com.github.biyanwen</groupId>
            <artifactId>jpa-comment-spring-boot-starter</artifactId>
            <version>1.0.2</version>
        </dependency>

但是在當前項目中無效,后面發(fā)現(xiàn)部分依賴已經(jīng)改變,應該是對高版本JPA不支持導致。今天基于該jar重新梳理實現(xiàn)過程。

實現(xiàn)方式

基于自定義注解以及Spring自動配置實現(xiàn)。

  1. 定義注解Comment,該注解定義在字段上,定義該列的中文描述。
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface Comment {
    /**
     * 注釋的值
     *
     * @return {@link String}
     */
    String value() default "";
}
  1. spring jpa是基于Habernate實現(xiàn),同樣我們需要基于接口org.hibernate.integrator.spi.Integrator,在生成ddl時進行擴展。
public class CommentIntegrator implements Integrator {
    public static final CommentIntegrator INSTANCE = new CommentIntegrator();

    public CommentIntegrator() {
        super();
    }

    @Override
    public void integrate(Metadata metadata, BootstrapContext bootstrapContext, SessionFactoryImplementor sessionFactory) {
        processComment(metadata);
    }

    /**
     * Not used.
     *
     * @param sessionFactoryImplementor     The session factory being closed.
     * @param sessionFactoryServiceRegistry That session factory's service registry
     */
    @Override
    public void disintegrate(SessionFactoryImplementor sessionFactoryImplementor, SessionFactoryServiceRegistry sessionFactoryServiceRegistry) {
    }

    /**
     * 生成注釋代碼
     *
     * @param metadata process annotation of this {@code Metadata}.
     */
    protected void processComment(Metadata metadata) {
        for (PersistentClass persistentClass : metadata.getEntityBindings()) {
            Class<?> clz = persistentClass.getMappedClass();
            if (clz.isAnnotationPresent(Comment.class)) {
                Comment comment = clz.getAnnotation(Comment.class);
                persistentClass.getTable().setComment(comment.value());
            }
            Property identifierProperty = persistentClass.getIdentifierProperty();
            if (identifierProperty != null) {
                propertyComment(persistentClass, identifierProperty.getName());
            } else {
                org.hibernate.mapping.Component component = persistentClass.getIdentifierMapper();
                if (component != null) {
                    Iterator<Property> iterator = component.getPropertyIterator();
                    while (iterator.hasNext()) {
                        propertyComment(persistentClass, iterator.next().getName());
                    }
                }
            }
            Iterator<Property> iterator = persistentClass.getProperties().iterator();
            while (iterator.hasNext()) {
                propertyComment(persistentClass, iterator.next().getName());
            }
        }
    }

    /**
     * 為屬性生成注釋
     *
     * @param persistentClass Hibernate {@code PersistentClass}
     * @param columnName      name of field
     */
    private void propertyComment(PersistentClass persistentClass, String columnName) {
        try {
            String comment = getPropertyComment(persistentClass, columnName);
            Value value = persistentClass.getProperty(columnName).getValue();
            if( value.getColumns().iterator().hasNext() ){
                String sqlColumnName = value.getColumns().iterator().next().getText();
                Iterator<org.hibernate.mapping.Column> columnIterator = persistentClass.getTable().getColumns().iterator();
                while (columnIterator.hasNext()) {
                    org.hibernate.mapping.Column column = columnIterator.next();
                    if (sqlColumnName.equalsIgnoreCase(column.getName())) {
                        column.setComment(comment);
                        break;
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private String getPropertyComment(PersistentClass persistentClass, String columnName) throws Exception {
        String comment = null;

        Field field = ReflectionUtils.findField(persistentClass.getMappedClass(), columnName);
        if (field != null) {
            if (field.isAnnotationPresent(Comment.class)) {
                comment = field.getAnnotation(Comment.class).value();
            } else {
                PropertyDescriptor descriptor = new PropertyDescriptor(field.getName(), persistentClass.getMappedClass());
                Method readMethod = descriptor.getReadMethod();
                Comment comment1 = readMethod.getAnnotation(Comment.class);
                if (comment1 != null) {
                    comment = comment1.value();
                }
            }
        }
        return comment;
    }
}
  1. 定義配置類,對HibernatePropertiesCustomizer進行擴展。
public class HibernateProperties implements HibernatePropertiesCustomizer {
    @Override
    public void customize(Map<String, Object> hibernateProperties) {
        hibernateProperties.put("hibernate.integrator_provider",    (IntegratorProvider) () -> Collections.singletonList(CommentIntegrator.INSTANCE));
    }
}
  1. 定義spring配置,實現(xiàn)自動裝配。

在resource目錄添加自動注入配置META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports,這樣通過引入jar就可以自動使用該配置。

cn.cycad.jpa.comment.config.CommentConfig

應用示例

  1. 比如現(xiàn)在有一個User實體,我們通過繼承基類。
@Entity
@Table(name = "t_user")
@Data
public class User extends Domain {

    @Id
    @Comment("業(yè)務主鍵")
    private String id;

    @Comment("用戶名稱")
    private String caption;

    @Comment("用戶年齡")
    private Integer age;
    
}
  1. 啟動服務后,可以看到控制臺輸出的建表語句信息。
Hibernate: 
    create table t_user (
        id varchar(255) not null,
        create_time timestamp(6),
        creator varchar(56),
        modified_time timestamp(6),
        modifier varchar(56),
        age integer,
        caption varchar(255),
        primary key (id)
    )
Hibernate: 
    comment on column t_user.id is
        '業(yè)務主鍵'
Hibernate: 
    comment on column t_user.age is
        '用戶年齡'
Hibernate: 
    comment on column t_user.caption is
        '用戶名稱'

責任編輯:武曉燕 來源: Java技術指北
相關推薦

2012-03-06 11:25:40

ibmdw

2021-10-06 23:31:45

HibernateJPASpring Data

2009-06-01 12:04:38

JPASpringJAVA

2023-05-23 10:01:51

冪等性抽象代數(shù)

2013-08-01 10:05:54

大數(shù)據(jù)信息安全

2022-04-28 08:05:05

數(shù)據(jù)庫數(shù)據(jù)庫交互

2013-09-22 10:15:01

Spring DataJPA

2009-06-18 15:28:08

Glassfish JSpring

2021-06-08 08:38:36

MySQL數(shù)據(jù)庫死鎖問題

2009-06-18 13:44:05

Spring2.0spring2.5

2019-11-26 14:30:20

Spring循環(huán)依賴Java

2009-06-01 16:18:30

SpringJPA集成

2024-02-26 08:42:10

亂碼UTF-8編碼

2022-07-13 08:53:28

函數(shù)Go語言

2025-11-12 07:31:41

RedisRDB 文件二進制

2022-08-27 15:15:31

iOS耗電后臺

2025-10-20 02:00:00

2023-12-26 17:07:56

GenAICIO

2024-02-26 08:21:51

CPUkafka死循環(huán)

2022-08-01 09:43:19

程序員Googlefacebook
點贊
收藏

51CTO技術棧公眾號

99久热在线精品视频| 91精品久久久久久| 激情综合丁香五月| 亚洲高清黄色| 亚洲色图另类专区| 精品麻豆av| 在线视频 91| 欧美视频亚洲视频| 一区二区在线视频| 午夜影院福利社| 91综合国产| 亚洲电影一区二区三区| 亚洲一区不卡在线| 色呦呦中文字幕| 另类调教123区| 国内偷自视频区视频综合| 超碰人人人人人人人| 欧洲一区在线| 在线视频欧美精品| 僵尸世界大战2 在线播放| a中文在线播放| 成人久久久精品乱码一区二区三区| 国产成人精品在线| 日本三级2019| 国产精品国内免费一区二区三区| 亚洲国产欧美在线成人app| 在线观看国产一级片| 欧美三级网站| 亚洲成人资源网| 曰韩不卡视频| 国产小视频在线播放| www.日韩大片| 99久久99久久| 国产精品久久久久久久免费| 久久综合影音| 欧美亚洲国产成人精品| 国产一级在线视频| 欧美搞黄网站| 久久久精品电影| 国产伦精品一区二区三区视频女| 欧美尿孔扩张虐视频| 日韩丝袜情趣美女图片| 99精品视频国产| 黄色成人小视频| 欧美伊人精品成人久久综合97| 大陆极品少妇内射aaaaa| 成人bbav| 香蕉乱码成人久久天堂爱免费| 亚洲天堂第一区| 九义人在线观看完整免费版电视剧| 久久精品一级爱片| 日本不卡在线播放| www.久久热.com| 日本一区二区三区久久久久久久久不| 久草热久草热线频97精品| 欧美 日韩 国产 成人 在线 91| 国产一区二区看久久| 成人精品久久一区二区三区| 97成人免费视频| 国内精品久久久久影院色| 成人在线免费观看视视频| 亚洲自拍第二页| 韩国女主播成人在线| 成人中文字幕在线观看| www.好吊色| 成人国产精品免费观看| 久久精品日产第一区二区三区精品版| 日本xxxxwww| 91麻豆swag| 欧美一区二区三区四区夜夜大片| 国产在线黄色| 国产精品久久久久精k8| 91手机视频在线| 免费电影网站在线视频观看福利| 亚洲大型综合色站| 欧美成人免费高清视频| 国产成人亚洲一区二区三区| 欧美福利视频导航| 极品白嫩的小少妇| 亚洲欧洲av| www.亚洲成人| 日本三级网站在线观看| 久久精品道一区二区三区| 国产精国产精品| 国产又大又黑又粗| 成人av网在线| 亚洲精品无人区| 欧美高清另类hdvideosexjaⅴ| 精品国产鲁一鲁一区二区张丽| 久久精品网站视频| 精品一区二区三区免费看| 亚洲黄色片网站| 免费看的黄色录像| 激情久久一区| 国产精品亚洲综合天堂夜夜| 国内精品偷拍视频| 久久精品网站免费观看| 欧美性受xxxx黑人猛交88| 伊人久久国产| 日韩一卡二卡三卡四卡| 免费毛片视频网站| 欧美在线黄色| 国产精品高清网站| 人妻一区二区三区免费| 国产精品久久久久久久久快鸭 | 亚洲精品久久久久久动漫器材一区 | 成年人的黄色片| 国产二区精品| 欧美壮男野外gaytube| 国产深喉视频一区二区| 久久久精品免费免费| 成年在线观看视频| 欧美一区=区三区| 亚洲男人天堂网站| 久久精品国产亚洲AV无码男同| 日韩二区三区四区| 精品一卡二卡三卡四卡日本乱码| 黄网站在线播放| 在线观看亚洲专区| 国产传媒第一页| 亚洲手机在线| 亚洲影视中文字幕| 日本视频在线免费观看| 色综合一个色综合| 精品视频站长推荐| 亚洲婷婷在线| 亚洲一区二区三区视频播放| 福利片在线看| 在线视频一区二区三区| 成人免费网站黄| 亚洲经典自拍| 国产精品日本一区二区 | 一区二区三区中文字幕精品精品| 国产一区视频免费观看| 在线日韩网站| 欧美在线视频观看免费网站| 日日夜夜精品免费| 亚洲国产精品久久人人爱蜜臀| 天堂av8在线| 日本一区二区三区视频| 国产精品久久久久久影视| 日本天堂在线| 日韩欧美成人区| 亚洲一区二区三区无码久久| 99国产精品久久久久久久| 国产在线一区二| 成入视频在线观看| 亚洲精美色品网站| 女人十八岁毛片| 91小视频在线观看| 人妻熟女一二三区夜夜爱| 亚洲v天堂v手机在线| 国产成人jvid在线播放| 免费在线观看一级毛片| 91国产免费观看| gv天堂gv无码男同在线观看| 蜜桃91丨九色丨蝌蚪91桃色| 一区一区视频| 欧洲大片精品免费永久看nba| 九九热这里只有精品6| 亚洲国产日韩在线观看| 五月天婷婷综合| 国产精品jizz| 免费美女久久99| 992tv成人免费观看| 国产精品亚洲一区二区在线观看| 欧美国产日产韩国视频| 天天色综合av| 欧美在线啊v一区| 欧美日韩午夜视频| 不卡视频在线看| 91av俱乐部| 天天做天天爱天天综合网| 99久久99久久| 欧洲av不卡| 久久精品久久久久电影| 亚洲欧美另类一区| 日韩欧美在线观看| 99热在线观看精品| 成人av网在线| 国产一伦一伦一伦| 国产精品videosex极品| 麻豆传媒一区| 国产高清视频一区二区| 26uuu另类亚洲欧美日本一| www.亚洲.com| 精品免费99久久| 欧美激情一区二区三区免费观看| 亚洲三级在线看| 亚洲色图14p| 黑人巨大精品欧美黑白配亚洲| 人妻夜夜添夜夜无码av| 波多野结衣在线观看一区二区| 1卡2卡3卡精品视频| 成人性生交大片免费观看网站| 色偷偷av一区二区三区| 五月激情婷婷网| 欧美丰满一区二区免费视频 | 91久久一区二区| 97成人资源站| 国产日本一区二区| 国产精品久久久久久在线观看| 日本不卡的三区四区五区| 久青草视频在线播放| 欧洲激情视频| 国外成人在线视频网站| 在线日韩三级| 国产成人精品一区二区| aa级大片免费在线观看| 久久综合亚洲社区| 超碰免费97在线观看| 亚洲精品wwwww| av一区二区三| 欧美日韩亚州综合| 日韩精品一区二区亚洲av| 亚洲综合视频在线| 国产麻豆视频在线观看| 国产亚洲成年网址在线观看| 香港三级日本三级| 国产一区二区三区黄视频 | 97se狠狠狠综合亚洲狠狠| 三日本三级少妇三级99| 免费高清在线一区| 日韩中文字幕二区| 亚洲中字在线| 日韩av三级在线| 亚洲人成久久| 日本手机在线视频| 精品成人久久| 337p亚洲精品色噜噜狠狠p| 综合精品久久| 操bbb操bbb| 一区二区三区毛片免费| 影音先锋欧美资源| 日韩久久精品| 亚洲欧美日本国产有色| 欧美亚洲在线日韩| 亚洲精品无人区| 久久一区二区中文字幕| 亚洲国产精品一区二区第一页| 蜜桃成人av| 欧美午夜视频在线| 久久99视频| 日本一区视频在线| 精品久久美女| 亚洲欧洲一区二区福利| 久久国产成人精品| 亚洲午夜精品一区二区三区| 99久久亚洲精品蜜臀| 亚洲在线欧美| 91精品国产视频| 女女百合国产免费网站| 国产精品分类| 国产日韩av网站| 国产视频一区三区| 国产激情在线观看视频| 免费av成人在线| 亚洲黄色av片| 国产成人av电影在线| 国产大尺度视频| 97久久精品人人澡人人爽| 蜜桃精品一区二区| 国产精品丝袜黑色高跟| 欧美风情第一页| 亚洲一区二区免费视频| 91国产丝袜播放在线| 91极品视觉盛宴| 一区二区久久精品66国产精品| 欧美一卡2卡三卡4卡5免费| 丰满少妇高潮在线观看| 亚洲欧美日韩久久久久久 | 美女久久99| 亚洲视频电影| 好吊日精品视频| 欧美老熟妇喷水| 美女久久久精品| 亚洲精品鲁一鲁一区二区三区| 99久久免费国产| 天堂资源在线视频| 洋洋av久久久久久久一区| 九九精品免费视频| 91精品啪在线观看国产60岁| 黄色一级a毛片| 中文字幕av日韩| 国产后进白嫩翘臀在线观看视频| 4p变态网欧美系列| 日本国产亚洲| 九九久久99| 91精品福利| 热久久精品国产| 国产黄色精品网站| 国产精品国产三级国产专业不| 亚洲欧美日韩国产一区二区三区 | 欧美日韩一区视频| 三级网站在线看| 俺去啦;欧美日韩| 性欧美xxx69hd高清| 亚洲aaaaaa| 欧美在线观看视频一区| 一卡二卡三卡视频| 久久99精品网久久| 四虎永久免费影院| 亚洲午夜国产一区99re久久| 中文字幕一区二区久久人妻| 亚洲激情 国产| av免费网站在线| 国产色婷婷国产综合在线理论片a| 好吊妞国产欧美日韩免费观看网站| 亚洲人成网站在线播放2019| 国产一区二区三区久久| 日本55丰满熟妇厨房伦| 国产精品网站在线播放| 羞羞影院体验区| 精品国偷自产国产一区| 久久日韩视频| 国产免费亚洲高清| 欧美猛男男男激情videos| 欧妇女乱妇女乱视频| 国产在线视视频有精品| 亚洲无人区码一码二码三码的含义| 亚洲aⅴ怡春院| 精品人妻一区二区三区蜜桃| 综合久久五月天| 全亚洲第一av番号网站| 久久精品国产第一区二区三区最新章节| 午夜精品久久99蜜桃的功能介绍| 国产又黄又猛又粗| 国产香蕉久久精品综合网| 久久精品一二区| 亚洲国产精品视频在线观看 | 亚洲福利一区二区| 国产99久一区二区三区a片 | 碰碰在线视频| 国产乱码精品一区二区三区中文 | 亚洲成a人v欧美综合天堂下载 | 人人妻人人澡人人爽欧美一区双| 久久99精品一区二区三区| 免费黄色国产视频| 欧美日韩国产高清一区二区 | 亚洲一级电影视频| 亚洲av无码乱码国产精品| 欧美成人国产va精品日本一级| 日本久久久久| 亚洲国产精品女人| 国产不卡视频在线播放| 久久午夜无码鲁丝片午夜精品| 欧美mv和日韩mv的网站| 欧美性猛片xxxxx免费中国| 99re视频在线| 在线国产欧美| 中文字幕在线观看网址| 色系网站成人免费| 成年人免费在线视频| 国产视频观看一区| 亚洲视频电影在线| 日本人添下边视频免费| 欧美日韩亚洲91| 国产女人在线视频| 国产一区二区在线免费| 欧美大片专区| 搡老熟女老女人一区二区| 色婷婷综合五月| 最新电影电视剧在线观看免费观看| 成人两性免费视频| 欧美涩涩视频| 给我看免费高清在线观看| 日本高清不卡视频| 精产国品自在线www| 国产伦视频一区二区三区| 久久人人97超碰国产公开结果| 国产18无套直看片| 日韩欧美国产综合| 亚洲精品88| 一级日韩一区在线观看| 国产成人免费视频精品含羞草妖精| 国产亚洲第一页| 亚洲天堂开心观看| 欧美黄色一级| 37pao成人国产永久免费视频| 国产精品女主播av| 成人免费一级视频| 国产精品久久久久久久久久| 欧美日韩四区| 久操视频免费看| 欧美一区二区三区电影| 暧暧视频在线免费观看| 亚洲成色www久久网站| 粉嫩av一区二区三区| 男人的天堂av网站| 欧美日韩ab片| av亚洲在线观看| 中文字幕第3页| 欧美日韩国产123区| 九色porny丨首页入口在线| 一区二区三区的久久的视频| 99久久精品情趣| 99草在线视频| 国产精品成人一区二区三区吃奶| 中文在线日韩| 天天舔天天操天天干|