【发布时间】:2014-10-03 11:22:33
【问题描述】:
我正在插入使用JFileChooser 选择的CSV 文件。导入时出现错误,它显示主键IS NULL。它是自动增量的(我使用了 SQL 命令)。奇怪的是,完全相同的插入代码适用于同一数据库中的不同表。这是我到目前为止的代码:
JAVA 代码
int returnVal = fileChooser.showOpenDialog(this);
if (returnVal == JFileChooser.APPROVE_OPTION) {
File file = fileChooser.getSelectedFile();
try {
Scanner sin = new Scanner(new FileReader(new File(file.getName())));
while (sin.hasNext()) {
String[] line = sin.nextLine().split(",");
String name = line[0];
String surname = line[1];
int age = Integer.parseInt(line[2]);
String gender = line[3];
String shoeSize = line[4];
Studentstbl st = new Studentstbl();
st.setAge(age);
st.setDonationStatus("N");
st.setFirstName(name);
st.setGender(gender);
st.setShoeSize(shoeSize);
st.setSurname(surname);
yritpatPUEntityManager.getTransaction().begin();
yritpatPUEntityManager.persist(st);
yritpatPUEntityManager.getTransaction().commit();
studentstblList.clear();
studentstblList.addAll(studentstblQuery.getResultList());
}
} catch (IOException ex) {
JOptionPane.showMessageDialog(jPanel1, "A problem occured when accessing the file "+file.getAbsolutePath(), "Error", JOptionPane.ERROR_MESSAGE);
}
} else {
JOptionPane.showMessageDialog(jPanel1, "Cancelled by user", "Error", JOptionPane.ERROR_MESSAGE);
}
SQL
create table studentstbl (
student_id int not null primary key
GENERATED ALWAYS AS IDENTITY
(START WITH 1, INCREMENT BY 1),
school_id int not null,
first_name varchar(60) not null,
surname varchar(60) not null,
age int not null,
gender varchar(1) not null,
shoe_size int not null,
donation_status varchar(1) not null)
和
ALTER TABLE STUDENTSTBL
ADD CONSTRAINT SCHOOL_ID FOREIGN KEY (SCHOOL_ID)
REFERENCES SCHOOLSTBL
(SCHOOL_ID)
CSV
aname,asname,2,M,1
bname,bsname,3,F,1
cname,csname,4,F,2
dname,dsname,5,F,3
ename,esname,7,M,3
fname,fsname,6,M,3
gname,gsname,8,F,4
hname,hsname,10,M,4
iname,isname,9,M,4
jname,jsname,14,F,7
kname,ksname,12,F,6
lname,lsname,13,F,6
mname,msname,3,F,1
nname,nsname,2,M,1
oname,osname,15,F,6
pname,psname,15,M,6
qname,qsname,12,M,4
rname,rsname,8,M,3
sname,ssname,7,M,3
tname,tsname,6,F,3
uname,usname,5,F,2
vname,vsname,14,M,6
wname,wsname,12,M,6
xname,xsname,6,F,2
yname,ysname,8,M,2
zname,zsname,7,M,2
【问题讨论】:
-
Studentstbl 实体的代码在哪里(顺便说一句,它的名字很糟糕。
Student有什么问题?)?另外,为什么要为文件的每一行开始一个新事务? -
我知道,我们学校有一个用于测试目的的标准命名约定。宁愿坚持下去,直到我出去
-
"你为什么要为文件的每一行开始一个新事务?" - 我是学生,还在学习这些东西。有没有更有效的方法?
-
是的:除非文件真的很大(读取:数百万行),否则单个事务会更快。阅读docs.jboss.org/hibernate/core/4.3/manual/en-US/html_single/…
标签: java sql insert primary-key auto-increment