hibernate对于已经存在的表,在实体添加字段后,达梦没有去更新表,新增字段没有添加到表中
hibernate配置如下:
我这边测试可以
原始pojo对象
@Entity
@Table(name="gl_user")
public class User {
@Id
@GeneratedValue
@GenericGenerator(name="uuid",strategy="uuid")
private int id;
private String name;
...
}
首次执行测试(插入、查询、更新)
public class UserDaoTest {
private UserDao userDao = new UserDao();
@Test
public void testSave() {
User user = new User();
user.setName("张三");
// 保存
userDao.save(user);
}
@Test
public void testGetById() {
User user = userDao.getById(1);
System.out.println(user);
}
@Test
public void testUpdate() {
// 从数据库获取一条存在的数据
User user = userDao.getById(1);
if (user == null) {
System.out.println("user (id = " + 1 + ") is null");
}
else {
user.setName("李四");
// 更新
userDao.update(user);
}
}
执行成功
查看数据库中,表自动创建成功
记录插入、更新成功
修改实体对象,增加addr属性
public class User {
@Id
@GeneratedValue
@GenericGenerator(name="uuid",strategy="uuid")
private int id;
private String name;
private String addr;
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
...
}
再次执行测试,正确通过
刷新数据库,可看到表结构已变化
查看数据,结果集中多了一列,多了一条数据(第二次测试插入的)
hibernate 关键配置信息如下
<!-- 配置数据库信息达梦数据库 -->
<property name="hibernate.dialect">org.hibernate.dialect.DmDialect</property>
<property name="connection.url">jdbc:dm://localhost:5236?logLevel=all&logDir=d:\jdbclog</property>
<property name="connection.driver_class">dm.jdbc.driver.DmDriver</property>
<property name="connection.username">SYSDBA</property>
<property name="hibernate.connection.password">SYSDBA</property>
<!-- 其他配置 -->
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<!--
create:先删除,再创建
update:如果表不存在就创建,不一样就更新,一样就什么都不做。
create-drop:初始化时创建表,SessionFactory执行close()时删除表。
validate:验证表结构是否一致,如果不一致,就抛异常。
-->
<property name="hbm2ddl.auto">update</property>
注意jdbc连接串中开启了日志记录
查看第一次测试运行时,日志中有建表语句如下
[SQL - 2021-03-05 12:37:09] tid:1{ conn-3, stmt-5 } executeUpdate(String): 0; [PARAMS]: "
create table gl_user (
id integer identity not null,
name varchar(255),
primary key (id)
)"; [USED TIME]: 13.1975ms;
第二次日志中有更新表语句如下
[SQL - 2021-03-05 12:44:31] tid:1{ conn-1, stmt-5 } executeUpdate(String): 0; [PARAMS]: "
alter table gl_user
add column addr varchar(255)"; [USED TIME]: 14.6203ms;
注意,如果是修改实体属性名,如将addr改为address
那么数据库自动更新的结果是新增一个address字段,原来的addr不会变。
即实体对象新增属性时,数据库表新增字段;
实体对象删掉属性时,数据库表对应字段不会自动删除,防止数据丢失;
实体对象修改属性名时,则视同删除老属性,新增一个新属性,即数据库表中新增新属性名的字段,老属性名字段保留不变
谢谢各位大佬得帮助,可能是初始化时候得问题,换了个环境的达梦就可以了
各位大佬们求教