Discuss / Java / 不可第二次运行

不可第二次运行

Topic source

我发现这一章的代码实例里都会因为“用户重复”的原因不可重复正常运行,会报错。

DatabaseInitializer里加入清理方法即可解决

package com.itranswarp.learnjava;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;

@Component
public class DatabaseInitializer {

	@Autowired
	JdbcTemplate jdbcTemplate;

	@PostConstruct
	public void init() {
		jdbcTemplate.update("CREATE TABLE IF NOT EXISTS users (" //
				+ "id BIGINT IDENTITY NOT NULL PRIMARY KEY, " //
				+ "email VARCHAR(100) NOT NULL, " //
				+ "password VARCHAR(100) NOT NULL, " //
				+ "name VARCHAR(100) NOT NULL, " //
				+ "UNIQUE (email))");
	}
	
	@PreDestroy
	public void clean() {
		jdbcTemplate.update("DROP TABLE users");
	}
}

如果表已经创建

在init()的第一行再加上个

jdbcTemplate.update("DROP TABLE IF EXISTS users");

就能不手动清除数据库表正常运行了(不然貌似报错后压根执行不到@PreDestroy方法)

String53719

#3 Created at ... [Delete] [Delete and Lock User]

你可能使用的不是HSQLDB数据库吧!

我是直接在eclipse里下载老师的实例代码没做任何修改运行的,应该是使用的HSQLDB。

我又去复现了一遍,运行会产生四个新文件:

testdb.log
testdb.properties
testdb.script
testdb.tmp

删掉这四个新文件也可正常运行

加上

jdbcTemplate.update("DROP TABLE IF EXISTS users");

就不需要 clean()

TEIAI_

#6 Created at ... [Delete] [Delete and Lock User]

或者在UserService的register方法最开始添加

// 如果用户已存在
User user = getUserByEmail(email);
if (user != null) {
	System.err.println("user: " + email+ " already exists.");
	return user;
}

子非鱼

#7 Created at ... [Delete] [Delete and Lock User]

感谢各位大佬,成功解决。

PreparedStatementCallback; integrity constraint violation: unique constraint or index violation ; SYS_CT_10097 table: USERS

  • 1

Reply