需要

对于oracle数据库,jpaEntity即便配置了正文注解@Column(columnDefinition = '列正文'),无奈在数据库层生成列的正文

解决方案

自定义注解,配置在Entity类上,我的项目初始化时,通过EntityManager获取所有的实体类,遍历实体类中是否配置了注解,如果配置了,动静拼接DDL语句并执行

  • 自定义注解:

    import java.lang.annotation.*;/*** description: * 解决jap依据实体类创立建表过程中无奈增加字段正文* @author MorningSun* @version 1.0 * @since JDK1.8 * date 11/6/2020 10:45 AM */@Target({ElementType.TYPE, ElementType.FIELD})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface JPAOracleComment {   /*** spring jpa + oracle add comment * @return */ String value() default "";}
    import com.orient.cssrc.jpa.model.JpaOracleComment;import lombok.extern.slf4j.Slf4j;import org.hibernate.SessionFactory;import org.hibernate.internal.SessionFactoryImpl;import org.hibernate.persister.entity.EntityPersister;import org.hibernate.persister.entity.SingleTableEntityPersister;import org.hibernate.persister.walking.spi.AttributeDefinition;import org.springframework.boot.CommandLineRunner;import org.springframework.boot.autoconfigure.orm.jpa.HibernateProperties;import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.stereotype.Component;import javax.annotation.Resource;import javax.persistence.EntityManager;import javax.persistence.EntityManagerFactory;import javax.persistence.PersistenceContext;import java.lang.reflect.Field;import java.util.Map;import java.util.Objects;/*** description: * * @author MorningSun * @version V1.0 * @since date 2020/12/25 */@Slf4j@Componentpublic class JpaOracleCommentInit implements CommandLineRunner {   @PersistenceContextprivate EntityManager entityManager;   @Resourceprivate JdbcTemplate jdbcTemplate;   @Resourceprivate HibernateProperties hibernateProperties;   @Overridepublic void run(String... args) throws Exception {       String ddlAuto = this.hibernateProperties.getDdlAuto();       if(Objects.nonNull(ddlAuto) && "update".equalsIgnoreCase(ddlAuto)){           this.scanCommentAnnotationOnEntityAndCreate();       }   }   private void scanCommentAnnotationOnEntityAndCreate(){       EntityManagerFactory entityManagerFactory = this.entityManager.getEntityManagerFactory();       SessionFactoryImpl sessionFactory = (SessionFactoryImpl)entityManagerFactory.unwrap(SessionFactory.class);       Map<String, EntityPersister> persisterMap = sessionFactory.getMetamodel().entityPersisters();       if(Objects.nonNull(persisterMap) && persisterMap.keySet().size() > 0){           for(Map.Entry<String, EntityPersister> entry: persisterMap.entrySet()){               Class<?> targetClazz = entry.getValue().getMappedClass();               SingleTableEntityPersister persister = (SingleTableEntityPersister)entry.getValue();               //数据表名String tableName = persister.getTableName();               //增加表的正文JpaOracleComment targetClazzAnno = targetClazz.getAnnotation(JpaOracleComment.class);               if(Objects.nonNull(targetClazzAnno)){                   String sql = "comment on table " +                           tableName +                           " is " +                           "'" + targetClazzAnno.value() + "'";                   this.jdbcTemplate.execute(sql);               }               for (AttributeDefinition attributeDefinition : persister.getAttributes()) {                   //属性名称String propertyName = attributeDefinition.getName();                   if (propertyName.equalsIgnoreCase("_identifierMapper")) {                       log.warn("尝试为实体类:" + targetClazz.getSimpleName() + "生成注解,发现了联结主键,临时无奈解决,已疏忽对应字段");                       continue;                   }                   Field field;                   try {                       field = targetClazz.getDeclaredField(propertyName);                       JpaOracleComment anno = field.getAnnotation(JpaOracleComment.class);                       if (Objects.nonNull(anno)) {                           //数据库字段名String[] columns = persister.getPropertyColumnNames(propertyName);                           String sql = "comment on column " +                                   tableName +                                   "." +                                   columns[0] +                                   " is " +                                   "'" + anno.value() + "'";                           this.jdbcTemplate.execute(sql);                       }                   } catch (NoSuchFieldException ex) {                       ex.printStackTrace();                   }               }           }       }   }}