需要
对于oracle
数据库,jpa
的Entity
即便配置了正文注解@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(); } } } } }}