ConstraintViolationException
异常信息:异常:org.hibernate.exception.ConstraintViolationException
异常的名字已经很明显了,其实就是数据库中有约束,表A与表B,表C均有关联,要删除表A的数据,先要删除表A和表B 以及表A和表C之间关联。否则一上来就删表A的数据就会报错。
解决Derby默认大小写敏感的问题
Derby的column值默认是大小写敏感的,查询的时候必须注意这个问题。
但是在客户端传过来的数据可能是千奇百怪的,如果数据库里存的是”Name”,传过来的是“name”就会查不到,但是不能要求客户端那么严格,一般来说,Name和name是一样的。
昨天,我研究了一下,找到一种非常麻烦的解决方法,那就是在创建表的时候加一个column,此column的值引用自某一个column,并且自动转为全大写或全小写,sql 语句如下:
-
(
-
employeeID int,
-
name varchar( 50 ),
-
caseInsensitiveName GENERATED ALWAYS AS( UPPER( name ) )
-
)
-
;
然后,在POJO类要增加一个attribute来对应这个column,当然了,在映射文件同样要加相应的property。
在然后,在需要查询employee的name时,将客户端传入的值先转为大写,注意,这时就不能去查询name这个column了,要查询caseInsensitiveName 。
瞧瞧,是不是很复杂啊。所以,我不推荐用这个方法。
今天我找到一种更简单的方法,废话少说,开始。
其实,在Derby中,支持这样的写法:
select * from employee where upper(name) =’WANG LIHONG’;
所以,我们不需要增加column,也不需要去改POJO和映射文件,只需要在查询时先把客户端传来的值变成大写,再用以下语句查询就好。
如果用HQL(最好用占位符,不要像我这样写,我这里举例就随便一点了):
” from Employee where upper(name)=”+”‘”+upperCname+”‘”;
如果用Criteria,需要用sqlRestriction()方法:
.add(Restrictions.sqlRestriction(“upper(cname)=?”,upperCname,Hibernate.STRING));
为什么会抛出这个异常:java.sql.SQLException: After end of result set
错误的片段代码如下:
try {
s=conn.createStatement();
rs=s.executeQuery(“select * from events where event_id=”+id);
while(rs.next()) {
System.out.println(“ok”);
}
}catch(SQLException e1) {
e1.printStackTrace();
}
String result=rs.getString(2);
System.out.println(result);
return result;
————–在while的条件里已经用了resulset,然后它就关闭了。但是在后面又调用了resultset,因为它已经关闭,所以就会抛出异常。
正确片段代码如下:
try {
s=conn.createStatement();
rs=s.executeQuery(“select * from events where event_id=”+id);
while(rs.next()) {
result=rs.getString(2);
}
}catch(SQLException e1) {
e1.printStackTrace();
}
return result;
青花瓷JAVA版
之前xfx推荐我的,非常经典。
真正的Derby新手教程,Derby安装,创建数据库,在Java程序中使用Derby
以下乃本人今天之研究成果,供广大菜鸟借鉴参考,如有高人路过发现错误,请不吝赐教。
1,下载并安装Derby:
下载地址:http://db.apache.org/derby /derby_downloads.html,下载最新版本。
我用的是10.5.3.0。
解压缩到任意文件夹,我的是:E:\Java\Joy\derby
2,配置环境变量:
建立DERBY_HOME,值:E:\Java\Joy\derby\db- derby-10.5.3.0-bin\db-derby-10.5.3.0-bin
在Path加入:%DERBY_HOME%\bin
在CLASSPATH加入:%DERBY_HOME%\lib \derby.jar;%DERBY_HOME%\lib\derbyclient.jar;%DERBY_HOME%\lib\derbytools.jar;%DERBY_HOME%\lib\derbynet.jar
3,测试看看Derby安装成功没有
开始—Run—CMD
运行 sysinfo
如果安装成功,将会看到相关信息,下面是截取的部分信息。 继续阅读 »
Hibernate学生选课,实现课程按照学生人数进行排序的方法
声明:编程新手,如有错漏,敬请指出。谢谢。
研究了一个星期hibernate,写了一些方法,一个学生可以选多门课,一门课有多个学生,我想把课程按照学生人数进行排序。
在Course类里,有一个attribute是student,是一个collection,通过查询Course,可以得到student这个 collection的size,也就是这个Course的人数。问题来了,hibernate里,可以在mapping文件里设置排序原则,即,在 hbm.xml文件里设置ordery by,但是无法order by一个collection。更不要说order by 一个collection的size了。
所以,我想了一个办法——自定义Comparator。
好了,开始吧。
POJO:Student
-
import java.util.HashSet;
-
import java.util.Set;
-
public class Student
-
{
-
private int sid;
-
private String sname;
-
private String sage;
-
-
private Set<Course> course=new HashSet<Course>();
-
-
public Student()
-
{
-
}
-
// getter/setter…
-
}
POJO:Course
-
-
import java.util.HashSet;
-
import java.util.Set;
-
-
public class Course
-
{
-
private int cid;
-
private String cname;
-
private Set<Student> student=new HashSet<Student>();
-
-
public Course() {}
-
//getter/setter…
-
-
}
Student.hbm.xml
<?xml version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE hibernate-mapping
PUBLIC “-//Hibernate/Hibernate Mapping DTD 3.0//EN”
“http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd”>
<hibernate-mapping>
<class name=”com.test.Student” table=”student” >
<id name=”sid” >
<column name=”sid” sql-type=”int(10)” not-null=”true”/>
<generator/>
</id>
<property name=”sname”>
<column name=”sname”/>
</property>
<property name=”sage”>
<column name=”sage”/>
</property>
<set access=”property” name=”course”
table=”student_course_link” batch-size=”10″ fetch=”select”
lazy=”true” cascade=”save-update” inverse=”true”
>
<key column=”sid”/>
<many-to-many column=”cid”/>
</set>
</class>
</hibernate-mapping>
Course.hbm.xml
<?xml version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE hibernate-mapping
PUBLIC “-//Hibernate/Hibernate Mapping DTD 3.0//EN”
“http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd”>
<hibernate-mapping>
<class name=”com.test.Course” table=”course” >
<id name=”cid” >
<column name=”cid” sql-type=”int(10)” not-null=”true” />
<generator/>
</id>
<property name=”cname”>
<column name=”cname”/>
</property>
<set access=”property” name=”student” batch-size=”10″ fetch=”select”
table=”student_course_link” lazy=”true” cascade=”save-update”
inverse=”false”>
<key column=”cid”/>
<many-to-many column=”sid”/>
</set>
</class>
</hibernate-mapping>
数据库三个表,student,course,student_course_link(中间表):
-
CREATE TABLE `java2`.`student` (
-
`sid` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
-
`sname` varchar(16) DEFAULT NULL,
-
`sage` varchar(16) DEFAULT NULL,
-
PRIMARY KEY (`sid`)
-
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-
DROP TABLE IF EXISTS `java2`.`course`;
-
CREATE TABLE `java2`.`course` (
-
`cid` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
-
`cname` varchar(16) DEFAULT NULL,
-
PRIMARY KEY (`cid`)
-
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-
DROP TABLE IF EXISTS `java2`.`student_course_link`;
-
CREATE TABLE `java2`.`student_course_link` (
-
`sid` int(10) NOT NULL,
-
`cid` int(10) NOT NULL,
-
PRIMARY KEY (`sid`,`cid`)
-
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
我们需要一个自定义Comparator:
-
-
import java.util.Comparator;
-
-
public final class HotCourseComparator implements Comparator {
-
-
public int compare(Object arg0, Object arg1) {
-
Course c1=(Course)arg0;
-
Course c2=(Course)arg1;
-
-
return c2.getStudent().size()-c1.getStudent().size(); // 按照选这门课的人数排序。
-
}
-
-
}
测试类:
-
{
-
public void rankCourse() {
-
session.beginTransaction();
-
Query query=session.createQuery("from Course");
-
List l=query.list();
-
Collections.sort(l,new HotCourseComparator()); //这里声明使用我们自定义的Comparator
-
for(int j=0;j<l.size();j++) {
-
Course c=(Course)l.get(j);
-
int snum=c.getStudent().size();
-
System.out.println(c.getCname()+" has "+snum+" students");
-
}
-
-
}
-
-
public static void main(String[] args)
-
{
-
TestManyToMany t = new TestManyToMany();
-
t.rankCourse();
-
-
}
-
}
运行结果:
C# has 4 students
Ruby on Rails has 4 students
PHP has 3 students
JAVA has 2 students
C has 2 students
PL/SQL has 2 students
MATLAB has 2 students
C++ has 1 students
Heskell has 1 students
Python has 1 students
如果有一天我死了,那一定是为JAVA而死的。。。。
标题这句话引用自我一位同学的QQ日志。我深有同感啊!
自从JAVA的课程开始以来,我们的日子就没有好过过。。。。。
JAVA SE才讲了一个星期就完了,JAVA EE的时间表是12天,目前已经进入尾声。。。。我想死的心都有了。上课完全不知道老师在讲什么,要命的是还是个印度老师,叽里呱啦,语速超快。
当老师以迅雷不及掩耳盗铃之势讲完一课,我和旁面的同学面面相觑——刚才发生了什么?
马上,ME就要开始了,我只有一句话——OMG!


