最近公司的低代码开发平台数据中心需要重构,需要在页面上创建表模型添加修改字段。涉及到动态生成表结构,动态生成模型实体类动态查询表字段等等,经过调研发现hibernate在这方面是很方便的,调用内置API就能完成系列操作,下面贴出核心代码: 存在的问题: 1、不支持字段的更新和删除 作者应该是考虑兼容性,才不做删除、更新字段的吧。如果那列数据库里面有数据了,把那列删了,那数据怎么办呢,或者原来的列是DateTime类型,需要把类型更新为int,那数据不就报错了么。/** * @author cjbi */ public class DynamicDdlTest { @Autowired private EntityManager entityManager; /** * 运行期的持久化实体没有必要一定表示为像POJO类或JavaBean对象那样的形式。 * Hibernate也支持动态模型在运行期使用Map)和象DOM4J的树模型那样的实体表示。 * 使用这种方法,你不用写持久化类,只写映射文件就行了。 **/ public static final String XML_MAPPING = "<?xml version="1.0" encoding="UTF-8"?>n" + "<!DOCTYPE hibernate-mapping PUBLICn" + " "-//Hibernate/Hibernate Mapping DTD 3.0//EN"n" + " "https://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">n" + "<hibernate-mapping>n" + " <class entity-name="Student" table="t_student">n" + " <id name="id" type="java.lang.Long" length="64" unsaved-value="null">n" + " <generator class="identity" />n" + " </id>" + " <property type="java.lang.String" name="username" column="username"/>n" + " <property name="password" type="java.lang.String" column="password"/>n" + " <property name="sex" type="java.lang.String" column="sex"/>n" + " <property name="age" type="java.lang.Integer" column="age"/>n" + " <property name="birthday" type="java.util.Date" column="birthday"/>n" + " </class>" + "</hibernate-mapping>"; @Test public void testDynamicDdl() { SessionFactory sessionFactory = entityManager.getEntityManagerFactory().unwrap(SessionFactory.class); StandardServiceRegistry serviceRegistry = sessionFactory.getSessionFactoryOptions().getServiceRegistry(); MetadataSources metadataSources = new MetadataSources(serviceRegistry); sessionFactory.getSessionFactoryOptions(); //读取映射文件 metadataSources.addInputStream(new ByteArrayInputStream(XML_MAPPING.getBytes())); Metadata metadata = metadataSources.buildMetadata(); //更新数据库Schema,如果不存在就创建表,存在就更新字段,不会影响已有数据 SchemaUpdate schemaUpdate = new SchemaUpdate(); schemaUpdate.execute(EnumSet.of(TargetType.DATABASE), metadata, serviceRegistry); //合并配置 Configuration cfg = new Configuration(); cfg.addInputStream(new ByteArrayInputStream(XML_MAPPING.getBytes())); SessionFactory newSessionFactory = cfg.buildSessionFactory(serviceRegistry); //保存对象 Session newSession = newSessionFactory.openSession(); for (int i = 0; i < 100; i++) { Map<String, Object> student = new HashMap<>(); student.put("username", "张三" + i); student.put("password", "adsfwr" + i); student.put("sex", i % 2 == 0 ? "male" : "female"); student.put("age", i); student.put("birthday", new Date()); newSession.save("Student", student); } //查询所有对象 Query query = newSession.createQuery("from Student"); List list = query.getResultList(); System.out.println("resultList: " + list); } }
既然这样,Hibernate干脆新增一列,所以应该不算什么问题,可以手动删除相关的列。
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算