看我的BaseModel
public class BaseModel implements Serializable {
@Id
@GeneratedValue(strategy = GenerationTypeAUTO)
@Column(name = "id")
private Long id;
protected BaseModel(){
thisid = 1L;
}
public Long getId() {
return id;
}
public void setId(Long id) {
thisid = id;
}
public boolean equals(Object other) {
if (other == null || othergetClass() != thisgetClass())
return false;
if(thisgetId() == null || ((BaseModel) other)getId() == null) return false;
return thisgetId()equals(((BaseModel) other)getId());
}
public int hashCode() {
return new HashCodeBuilder()append(getId())toHashCode();
}
}
这里的BaseModel是我的实体类的父类,我错误的原因是序列化没有重写好equals函数,因为动态生成sql语句的时候主键默认为null,无法识别这是不是一个新的对象(我的理解),所以重写的时候多了
if(thisgetId() == null || ((BaseModel) other)getId() == null) return false;
因为主键不为空,为null肯定不相等。我就这样解决了,不知道能不能帮到你了。
create or replace procedure sp_crt_tbl_from_dic(p_src_tbl varchar2,
p_tgt_tbl_name varchar2,
p_prt_flg varchar2,
p_tx_date varchar2) is
v_col varchar2(500) := '';
v_col_data_type varchar2(100) := '';
v_sql varchar2(25000) := '';
v_col_list varchar2(20000) := ' ';
v_prt_sql varchar2(2000) := '';
v_grant_sql varchar2(2000) := '';
v_crt_syn_sql varchar2(2000) := '';
v_drop_tbl_sql varchar2(2000) := '';
i_tbl_cnt number(1, 0) := 0;
v_step_no varchar2(3) := '';
begin
--step 1
v_step_no := '1';
select count(1) into i_tbl_cnt from tabs where table_name = p_src_tbl;
if (i_tbl_cnt = 0) then
sp_log('sp_crt_tbl', v_step_no, '3', p_tx_date, p_src_tbl || '不存在');
return;
end if;
--step 2
v_step_no := '2';
select count(1)
into i_tbl_cnt
from tabs
where table_name = p_tgt_tbl_name;
if (i_tbl_cnt > 0) then
v_drop_tbl_sql := 'drop table ' || p_tgt_tbl_name;
execute immediate v_drop_tbl_sql;
end if;
v_step_no := '1';
sp_log('sp_crt_tbl_from_dic',v_step_no,'1',p_tx_date,p_tgt_tbl_name || '建表开始');
v_sql := 'create table ' || p_tgt_tbl_name || '(';
v_col := '';
v_col_data_type := '';
v_col_list := '';
for cur_col_name in (
SELECT TCOLUMN_NAME col_name,
CASE WHEN TDATA_TYPE IN ('VARCHAR2', 'CHAR') THEN TDATA_TYPE || '(' || TDATA_LENGTH || ')'
WHEN TDATA_TYPE IN ('NUMBER') THEN TDATA_TYPE || '(' || TDATA_PRECISION || ',' || TDATA_SCALE || ')'
WHEN TDATA_TYPE IN ('DATE') THEN TDATA_TYPE ELSE '' END col_data_type
FROM COLS T
where TTABLE_NAME = p_src_tbl
order by to_number(TCOLUMN_ID)) loop
v_col := trim(cur_col_namecol_name);
v_col_data_type := trim(cur_col_namecol_data_type);
v_col_list := trim(v_col_list) || trim(v_col) || ' ' || trim(v_col_data_type) || ',';
end loop;
v_sql := trim(v_sql) || trim(v_col_list) || ')';
v_sql := replace(v_sql, ',)', ')');
if (p_prt_flg = '1') then
v_prt_sql := ' partition by range (part_id) (partition prt_1 values less than(2),partition prt_2 values less than(3),partition prt_3 values less than(4),partition prt_4 values less than(5))';
v_sql := v_sql || v_prt_sql;
end if;
execute immediate v_sql;
sp_log('sp_crt_tbl_from_dic',v_step_no,'2',p_tx_date,p_tgt_tbl_name || '建表开始结束');
v_step_no := '2';
sp_log('sp_crt_tbl_from_dic', v_step_no,'1',p_tx_date,p_tgt_tbl_name || '赋权限开始');
v_grant_sql := 'grant select,insert,update,delete on ' || p_tgt_tbl_name ||
' to iclientoopr,iclientomoia';
if (v_grant_sql is not null) then
execute immediate v_grant_sql;
end if;
--- 给OPERQRY赋权限
v_grant_sql := 'grant select on ' || p_tgt_tbl_name || ' to OPERQRY';
if (v_grant_sql is not null) then
execute immediate v_grant_sql;
end if;
sp_log('sp_crt_tbl_from_dic',v_step_no,'2',p_tx_date,p_tgt_tbl_name || '赋权限结束');
--创建日标同义词
--step 4
v_step_no := '3';
v_crt_syn_sql := 'create or replace public synonym ' || p_tgt_tbl_name ||
' for iclientodata' || p_tgt_tbl_name;
if (v_crt_syn_sql is not null) then
execute immediate v_crt_syn_sql;
end if;
sp_log('v_crt_syn_sql',v_step_no,'2',p_tx_date,p_tgt_tbl_name || '创建结束');
exception
when others then
sp_log('sp_crt_tbl_from_dic',v_step_no,'3',p_tx_date,p_tgt_tbl_name || '创建异常:' || SQLERRM);
end;
1这个不好做,如果说要修改hibernate的文件话也是要重启服务器的,意义就不是很大了。
2你的想法还是可以实现的,生成文件+创建表都在java中作。无非是create一个表(表列组装),一个java实体类文件,hibernate映射文件,修改hibernate配置文件,不过比较麻烦了。
3建议:不要使用hibernate,使用jdbc+自己的一个映射文件。
下面是一个简单的连接MySQL数据库,并 *** 作数据库表的例子:
import javasql;
public class TestMysql {
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
//加载驱动
ClassforName("commysqljdbcDriver");
//创建连接
conn = DriverManager
getConnection("jdbc:mysql://localhost/bbsuser=用户名&password=密码");
stmt = conncreateStatement();
rs = stmtexecuteQuery("select from user");
while (rsnext()) {
String user = rsgetString(1);
String password = rsgetString(2);
Systemoutprintln("用户名:" + user + "," +" 密码:" + password );
}
} catch (ClassNotFoundException ex) {
exprintStackTrace();
} catch (SQLException ex) {
exprintStackTrace();
} finally {
try {
if (rs != null) {
rsclose();
rs = null;
}
if (stmt != null) {
stmtclose();
stmt = null;
}
if (conn != null) {
connclose();
conn = null;
}
} catch (SQLException e) {
eprintStackTrace();
}
}
}
}
当然前提是要把MySQL的连接驱动JAR文件添加到工程里
首先创建一个基于对话框的MFC应用程序ADO_Accesssln然后在stdafxh头文件末尾添加(网上有说在某个#include后面的添加的,也有说在合适位置添加的,我这里直接添加在最末尾)
#import "C:\Program Files\Common Files\System\ado\msado15dll" no_namespace rename("EOF", "adoEOF")
添加完成后#import下面会出现红色波浪线提示错误, 然后最好是执行一次生成解决方案,会提示生成成功,但是红色波浪线依然在,之前自己被它困扰好久,网上有说不用理会的,之前没理会也确实后来就莫名其妙的不见了,现在我知道了,当生成成功后左下角仍然提示正在分析····文件,等待分析完了红色波浪线也就消失了。
第二步,在ADO_AccessDlhh 类里的public下添加 _ConnectionPtr m_pConnection;//连接access数据库的链接对象 _RecordsetPtr m_pRecordset;//结果集对象
第三步,初始化数据库连接。 在ADO_AccessDlh类的OnInitDialog()初始化成员函数里添加如下代码:
数据库连接就没问题了,剩下的就是功能模块了。
以上就是关于spring boot使用jpa,可不可以动态生成数据库表全部的内容,包括:spring boot使用jpa,可不可以动态生成数据库表、oracle 如何动态创建表、Java高手进来。。怎么动态建表等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)