ConstraintViolationException

Joy 分类:好好学习 | Joy 标签: Joy 发表于2010/03/24,17:46 | 2条评论

异常信息::org..exception.ConstraintViolationException

异常的名字已经很明显了,其实就是数据库中有约束,表A与表B,表C均有关联,要删除表A的数据,先要删除表A和表B 以及表A和表C之间关联。否则一上来就删表A的数据就会报错。

解决Derby默认大小写敏感的问题

Joy 分类:好好学习 | Joy 标签: Joy 发表于2010/03/17,15:26 | 3条评论

Derby的column值默认是大小写敏感的,查询的时候必须注意这个问题。

但是在客户端传过来的数据可能是千奇百怪的,如果数据库里存的是”Name”,传过来的是“name”就会查不到,但是不能要求客户端那么严格,一般来说,Name和name是一样的。

昨天,我研究了一下,找到一种非常麻烦的解决方法,那就是在创建表的时候加一个column,此column的值引用自某一个column,并且自动转为全大写或全小写,sql 语句如下:

CREATE TABLE employee
  1. (
  2. employeeID               int,
  3. name                        varchar( 50 ),
  4. caseInsensitiveName   GENERATED ALWAYS AS( UPPER( name ) )
  5. )
  6. ;

然后,在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,.STRING));

为什么会抛出这个异常:java.sql.SQLException: After end of result set

Joy 分类:好好学习 | Joy 标签: Joy 发表于2010/03/11,14:18 | 1条评论

错误的片段代码如下:
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版

Joy 分类:好好学习 | Joy 标签: Joy 发表于2010/03/04,10:29 | 9条评论

之前xfx推荐我的,非常经典。

真正的Derby新手教程,Derby安装,创建数据库,在Java程序中使用Derby

Joy 分类:好好学习 | Joy 标签: Joy 发表于2010/03/02,15:47 | 4条评论

以下乃本人今天之研究成果,供广大菜鸟借鉴参考,如有高人路过发现错误,请不吝赐教。

1,下载并安装Derby:

下载地址:http://db.apache.org/ /_downloads.html,下载最新版本。

我用的是10.5.3.0。

解压缩到任意文件夹,我的是:E:\\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学生选课,实现课程按照学生人数进行排序的方法

Joy 分类:好好学习 | Joy 标签: Joy 发表于2010/03/01,15:18 | 没有评论

声明:编程新手,如有错漏,敬请指出。谢谢。

研究了一个星期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

package com.test;
  1. import .util.HashSet;
  2. import java.util.Set;
  3. public class Student
  4. {
  5. private int sid;
  6. private String sname;
  7. private String sage;
  8.  
  9. private Set<Course> course=new HashSet<Course>();
  10.  
  11. public Student()
  12. {
  13. }
  14. // getter/setter…
  15. }

POJO:Course

package com.test;
  1.  
  2. import java.util.HashSet;
  3. import java.util.Set;
  4.  
  5. public class Course
  6. {
  7. private int cid;
  8. private String cname;
  9. private Set<Student> student=new HashSet<Student>();
  10.  
  11. public Course() {}
  12. //getter/setter…
  13.  
  14. }

Student.hbm.xml
<?xml version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE -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(中间表):

DROP TABLE IF EXISTS `java2`.`student`;
  1. CREATE TABLE `java2`.`student` (
  2. `sid` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. `sname` varchar(16) DEFAULT NULL,
  4. `sage` varchar(16) DEFAULT NULL,
  5. PRIMARY KEY (`sid`)
  6. ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
  7.  
  8. DROP TABLE IF EXISTS `java2`.`course`;
  9. CREATE TABLE `java2`.`course` (
  10. `cid` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  11. `cname` varchar(16) DEFAULT NULL,
  12. PRIMARY KEY (`cid`)
  13. ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
  14.  
  15. DROP TABLE IF EXISTS `java2`.`student_course_link`;
  16. CREATE TABLE `java2`.`student_course_link` (
  17. `sid` int(10) NOT NULL,
  18. `cid` int(10) NOT NULL,
  19. PRIMARY KEY (`sid`,`cid`)
  20. ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

我们需要一个自定义Comparator:

package com.test;
  1.  
  2. import java.util.Comparator;
  3.  
  4. public final class HotCourseComparator implements Comparator {
  5.  
  6. public int compare(Object arg0, Object arg1) {
  7. Course c1=(Course)arg0;
  8. Course c2=(Course)arg1;
  9.  
  10. return c2.getStudent().size()-c1.getStudent().size(); // 按照选这门课的人数排序。
  11. }
  12.  
  13. }

测试类:

public class TestManyToMany
  1. {
  2. public void rankCourse() {
  3. session=HibernateUtil.getSessionFactory().getCurrentSession();
  4. session.beginTransaction();
  5. Query query=session.createQuery("from Course");
  6. List l=query.list();
  7. Collections.sort(l,new HotCourseComparator()); //这里声明使用我们自定义的Comparator
  8. for(int j=0;j&lt;l.size();j++) {
  9. Course c=(Course)l.get(j);
  10. int snum=c.getStudent().size();
  11. System.out.println(c.getCname()+" has "+snum+" students");
  12. }
  13.  
  14. }
  15.  
  16. public static void main(String[] args)
  17. {
  18. TestManyToMany t = new TestManyToMany();
  19. t.rankCourse();
  20.  
  21. }
  22. }

运行结果:

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而死的。。。。

Joy 分类:生活点滴 | Joy 标签: Joy 发表于2009/12/08,15:52 | 20条评论

标题这句话引用自我一位同学的QQ日志。我深有同感啊!

自从JAVA的课程开始以来,我们的日子就没有好过过。。。。。

SE才讲了一个星期就完了, EE的时间表是12天,目前已经进入尾声。。。。我想死的心都有了。上课完全不知道老师在讲什么,要命的是还是个印度老师,叽里呱啦,语速超快。

当老师以迅雷不及掩耳盗铃之势讲完一课,我和旁面的同学面面相觑——刚才发生了什么?

马上,ME就要开始了,我只有一句话——OMG!