您的位置:首页 > 其它

多地多关联的增加,修改和删除

2009-01-24 23:43 106 查看
packagecom.score.test;

importjava.util.HashSet;
importjava.util.Properties;

importjavax.naming.InitialContext;
importjavax.naming.NamingException;

importcom.score.dao.CourseDAO;
importcom.score.dao.ScoreDAO;
importcom.score.dao.StudentDAO;
importcom.score.entity.Course;
importcom.score.entity.Score;
importcom.score.entity.Student;

publicclassTestScore{

/**
*@paramargs
*@throwsNamingException
*/
publicstaticvoidmain(String[]args)throwsNamingException{
Propertiesprops=newProperties();
props.setProperty("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory");
props.setProperty("java.naming.provider.url","localhost:1099");
props.setProperty("java.naming.factory.url.pkgs","org.jboss.naming");
InitialContextcxt=newInitialContext(props);
try{

ScoreDAOsdao=(ScoreDAO)cxt.lookup("ScoreDAOBean/remote");
StudentDAOstudao=(StudentDAO)cxt.lookup("StudentDAOBean/remote");
CourseDAOcoudao=(CourseDAO)cxt.lookup("CourseDAOBean/remote");
Scores1=newScore();
Scores2=newScore();
Studentstu1=studao.findStudentById(newInteger(1));
Coursec1=coudao.findCourseById(newInteger(1));
Coursec2=coudao.findCourseById(newInteger(2));

HashSet<Course>hs=newHashSet<Course>();
hs.add(c1);
hs.add(c2);

stu1.setCourses(hs);
studao.updateStudent(stu1);

s1.setCourse(c1);
s1.setStudent(stu1);
s1.setScore(99d);

s2.setCourse(c2);
s2.setStudent(stu1);
s2.setScore(98d);

sdao.addScore(s1);
sdao.addScore(s2);

}catch(Exceptione){
e.printStackTrace();
}

}

}
由于没有设置级联增加,所有这里手工增加。
修改关联表:
try{
ScoreDAOscoredao=(ScoreDAO)cxt.lookup("ScoreDAOBean/remote");List<Score>ls=scoredao.findScoreByStudentId(newInteger(1));for(Scores:ls){s.setScore(100);scoredao.updateScore(s);}}catch(Exceptione){e.printStackTrace();}
删除学生:
try{ScoreDAOscoredao=(ScoreDAO)cxt.lookup("ScoreDAOBean/remote");StudentDAOstudao=(StudentDAO)cxt.lookup("StudentDAOBean/remote");List<Score>ls=scoredao.findScoreByStudentId(newInteger(1));for(Scores:ls){//s.setScore(100);//scoredao.updateScore(s);Studentstu=s.getStudent();studao.deleteStudent(stu.getId());s.setStudent(null);scoredao.updateScore(s);}
报错:
java.lang.reflect.UndeclaredThrowableExceptionat$Proxy1.deleteStudent(UnknownSource)atcom.score.test.TestDelete.main(TestDelete.java:33)Causedby:java.lang.ClassNotFoundException:javax.persistence.EntityExistsExceptionatorg.jboss.remoting.serialization.ClassLoaderUtility.loadClass(ClassLoaderUtility.java:82)atorg.jboss.remoting.loading.RemotingClassLoader.loadClass(RemotingClassLoader.java:76)atjava.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)atjava.lang.Class.forName0(NativeMethod)atjava.lang.Class.forName(Class.java:247)atorg.jboss.remoting.loading.ObjectInputStreamWithClassLoader.resolveClass(ObjectInputStreamWithClassLoader.java:174)atjava.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1575)atjava.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1496)atjava.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1732)atjava.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)atjava.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1947)atjava.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1871)atjava.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753)atjava.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)atjava.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1947)atjava.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1871)atjava.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753)atjava.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)atjava.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1947)atjava.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1871)atjava.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753)atjava.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)atjava.io.ObjectInputStream.readObject(ObjectInputStream.java:351)atorg.jboss.remoting.serialization.impl.java.JavaSerializationManager.receiveObjectVersion2_2(JavaSerializationManager.java:239)atorg.jboss.remoting.serialization.impl.java.JavaSerializationManager.receiveObject(JavaSerializationManager.java:133)atorg.jboss.remoting.marshal.serializable.SerializableUnMarshaller.read(SerializableUnMarshaller.java:120)atorg.jboss.remoting.transport.socket.MicroSocketClientInvoker.versionedRead(MicroSocketClientInvoker.java:957)atorg.jboss.remoting.transport.socket.MicroSocketClientInvoker.transport(MicroSocketClientInvoker.java:586)atorg.jboss.remoting.MicroRemoteClientInvoker.invoke(MicroRemoteClientInvoker.java:122)atorg.jboss.remoting.Client.invoke(Client.java:1634)atorg.jboss.remoting.Client.invoke(Client.java:548)atorg.jboss.aspects.remoting.InvokeRemoteInterceptor.invoke(InvokeRemoteInterceptor.java:62)atorg.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)atorg.jboss.aspects.tx.ClientTxPropagationInterceptor.invoke(ClientTxPropagationInterceptor.java:67)atorg.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)atorg.jboss.aspects.security.SecurityClientInterceptor.invoke(SecurityClientInterceptor.java:53)atorg.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)atorg.jboss.ejb3.remoting.IsLocalInterceptor.invoke(IsLocalInterceptor.java:74)atorg.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)atorg.jboss.ejb3.stateless.StatelessRemoteProxy.invoke(StatelessRemoteProxy.java:107)at$Proxy1.deleteStudent(UnknownSource)atcom.score.test.TestDelete.main(TestDelete.java:33)atorg.jboss.aspects.remoting.InvokeRemoteInterceptor.invoke(InvokeRemoteInterceptor.java:74)atorg.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)atorg.jboss.aspects.tx.ClientTxPropagationInterceptor.invoke(ClientTxPropagationInterceptor.java:67)atorg.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)atorg.jboss.aspects.security.SecurityClientInterceptor.invoke(SecurityClientInterceptor.java:53)atorg.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)atorg.jboss.ejb3.remoting.IsLocalInterceptor.invoke(IsLocalInterceptor.java:74)atorg.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)atorg.jboss.ejb3.stateless.StatelessRemoteProxy.invoke(StatelessRemoteProxy.java:107)...2more
删除的顺序不对,看JBOSS报错:
Causedby:java.sql.BatchUpdateException:Cannotdeleteorupdateaparentrow:aforeignkeyconstraintfails(`ejb3/tb_score`,CONSTRAINT`FKFACAA58158DBE5D8`FOREIGNKEY(`student_id`)REFERENCES`tb_student`(`id`))atcom.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1213)atcom.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:912)atorg.jboss.resource.adapter.jdbc.WrappedStatement.executeBatch(WrappedStatement.java:519)atorg.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)atorg.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:246)...36more
先删除关联表的记录后才能删除:
try{ScoreDAOscoredao=(ScoreDAO)cxt.lookup("ScoreDAOBean/remote");StudentDAOstudao=(StudentDAO)cxt.lookup("StudentDAOBean/remote");List<Score>ls=scoredao.findScoreByStudentId(newInteger(1));for(Scores:ls){//s.setScore(100);//scoredao.updateScore(s);scoredao.deleteScore(s.getId());}
这里还不能删除student,因为他还跟course表有关联。-------------------------------------------------------------------------------------------------------------------------若是级联删除,可以直接删除student的,若级联删除的是score,score这个关联表被删除了。
@OneToMany(mappedBy="student",cascade=CascadeType.REMOVE)publicSet<Score>getScores(){returnscores;}publicvoidsetScores(Set<Score>scores){this.scores=scores;}
SQL输出:
deletefromtb_scorewhereid=?23:35:22,343INFO[STDOUT]Hibernate:deletefromtb_scorewhereid=?23:35:22,343INFO[STDOUT]Hibernate:deletefromtb_studentwhereid=?
但是怎么连student和course的关联表也删除了呢?----级联的意思:不仅删除自己,
也删除与自己关联的对象(关联表)---暂且这么理解,有待严格的验证。
这里由于student对course没有设置级联删除,否则连同course表的级联也没有了。。。

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: