首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 基础问题一大把 [已结贴,结贴人:joejoe1991]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-10-26 19:22:23 楼主
    积累了N多问题 就等着今天呢。总算有100分了

    1.线程操作 。 怎么样才算得到了对象的锁呢? 是调用对象上的方法就会得到 还是怎么样?
    2.Hibernate 更新数据 把主键和要更新的数据封装到了pojo里
      我粗心把update写成了save 结果发现居然也更新了 而且数据库里没有出现也没有新增加一条记录 这是咋回事?
    3.用Hibernate对数据库进行查询 然后将结果保存在request到 forward到一个页面上去显示
        在显示以后 手动到数据库里加一条记录  这时刷新页面 并没有看到新增加的页面 。 只有把tomcat重起以后 再刷新 才能看到
      这是为啥  宝宝说可能是Hibernate缓存?

    4.
            String str = "sdfdfddd\0123123";
            System.out.println(str);
            谁帮忙解释一下这两行代码的输出情况啊 主要是看不懂为什么会少输出几个字符
    5.Server ser = new Server();
      ser.setID(Integer.parseInt(request.getParameter("id")));
      ser.setTitle(request.getParameter("title"));
      ser.setContent(request.getParameter("content"));
      session.update(ser);

      上面这些代码 对数据表进行更新 Server是一个pojo
        结果发现并没有对原始记录进行更新 也是另外新加了一条记录。
        这是咋回事呢?
      不过我换成这样就能正常更新了:
      Server ser = session.get(Server.class,request.getParameter("id"));
        ser.setID(Integer.parseInt(request.getParameter("id")));
      ser.setTitle(request.getParameter("title"));
      ser.setContent(request.getParameter("content"));
      session.update(ser);

    6. 在做一个swing小东西时发现的问题
        界面上有50多个JLabel 我要循环设置每个JLabel的Text属性的值 。
      难道 要把每个label都加到集合里 然后再循环吗 这样是不是太麻烦 如果是上百个咋办呢? 有什么方法能方便一点呢? 好像用反射可以做到?

    7.Java编程思想上写到: < < 只有对数值右端的5位才有用 这样可以防止我们移位超过int类型所具有的位数
      这句话是什么意思啊。/ 为什么超过5位就会超过int类型所具有的位数呢?

    谢谢大牛指教  小菜我学习一下

     
    100  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-10-26 19:24:061楼 得分:0
    打错了

    3.用Hibernate对数据库进行查询 然后将结果保存在request里 forward到一个页面上去显示
        在显示以后 手动到数据库里加一条记录  这时刷新页面 并没有看到新增加的数据 。 只有把tomcat重起以后 再刷新 才能看到
      这是为啥  宝宝说可能是Hibernate缓存?

    5.Server ser = new Server();
      ser.setID(Integer.parseInt(request.getParameter("id")));
      ser.setTitle(request.getParameter("title"));
      ser.setContent(request.getParameter("content"));
      session.update(ser);

      上面这些代码 对数据表进行更新 Server是一个pojo 
        结果发现并没有对原始记录进行更新 而是另外新加了一条记录。 
        这是咋回事呢? 
      不过我换成这样就能正常更新了:
      Server ser = session.get(Server.class,request.getParameter("id"));
        ser.setID(Integer.parseInt(request.getParameter("id")));
      ser.setTitle(request.getParameter("title"));
      ser.setContent(request.getParameter("content"));
      session.update(ser);
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-10-26 20:26:572楼 得分:30
    1.线程操作 。 怎么样才算得到了对象的锁呢? 是调用对象上的方法就会得到 还是怎么样?
    当多线程操作的是同一个对象(即操作的是同一数据)时,调用对象的方法,而你的方法是申明的Synchronizied的就得到了这个对象的锁
    这种最经典的就是生产者--消费者设计模式:
    例如:
    Java code
    //Depot.java public Depot{ public synchronizied void add(){ //其实这里的Synchronizied的对象就是this,当以Depot的实例来构造的线 if(什么条件){ //程,调用该对象的add方法时,该对象就得到了锁,以Depot的同一实例来 this.wait(); //构造的的其他线程就会在此对象的等待池或在锁池等等待; } ......... this.notifyAll(); } public synchronizied dataType remove(){ if(什么条件){ this.wait(); } ......... this.notifyAll(); } } //ThreadA.java public ThreadA extends Thread{ //以Depot的事例来构造线程 private Depot d; public ThreadA(Depot d){ this.d = d; } public void run(){ d.add(); } } //ThreadB.java public ThreadB extends Thread{ private Depot d; public ThreadA(Depot d){ this.d = d; } public void run(){ d.remove(); } } //Test.java public class Test{ public static void main(String[] args){ Depot d = new Depot(); Thread a = new Thread(d); Thread b = new Thread(d); a.start(); b.start(); } }


    还有一种:

    //ThreadTest.java

    public ThreadTest extends Thread{
        private static int i = 0;
        private Object obj = new Object();
        public void run(){
            while(i < 36){
                synchronizied(obj){
                .......................
                }
            }
        }
    }

    当生成多个ThreadTest后,多个线程共享数据和代码,但是obj是唯一的,所以只要运行时,某一个执行到while循环内后就得到的Obj的锁,其他线程要到obj的锁池,去等锁。。
    吃饭了再来回答你后面的问题。。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-10-26 20:43:423楼 得分:0
    ^_^
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-10-26 20:48:444楼 得分:5
    4.
            String str = "sdfdfddd\0123123";
            System.out.println(str);
            谁帮忙解释一下这两行代码的输出情况啊 主要是看不懂为什么会少输出几个字符
    -----------------------

    里面的\0是结束  字符串是一这个做结尾的
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-10-26 21:05:485楼 得分:10
    2.Hibernate 更新数据 把主键和要更新的数据封装到了pojo里
      我粗心把update写成了save 结果发现居然也更新了 而且数据库里没有出现也没有新增加一条记录 这是咋回事?
      anser : save时覆盖了原来的数据
    3.不清楚,不断言。
    4.String str = "sdfdfddd\0123123";
      System.out.println(str);
      谁帮忙解释一下这两行代码的输出情况啊 主要是看不懂为什么会少输出几个字符
     
    Java code
    String str = "sdfdfddd\0123123"; 中间的\在java是转义符号,记得\0在Java中代表null,不太清楚了 如果要原样输出应该是String str = "sdfdfddd\\0123123";

    5.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-10-26 22:03:346楼 得分:0
    to  sharpyuce  你回答的几个问题的答案我都不是太满意
    第一个:你说的那些我知道 可是没有回答到我问的点上 可能是我没有表达清楚
            synchronized(obj)
              {.......}  这个同步块 要得到obj的锁才能进入 如果我在这个同步块被线程a执行之前调用了另一个方法b  b并不是同步方法 并把obj传为参数

                  传了进去
              这时 我在b方法里对这个obj做什么操作 就算是得到了对象的锁 使的那个线程a不能进入同步块? 你说的进入synchronized修饰的方法就会得到锁
                和没说一样嘛 对不?
    第二个:save时覆盖了原来的数据  没有说清楚啊 要是save都能更新了还要update干什么 
    第四个: 我知道 \ 是转义字符 我也并不是想原样输出  只是在学C语言的时候 \0 是字符串截断用的 我就是想试试在java里它是什么意思
            不知道为什么输出会换行 而且少输出了012
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-10-26 22:44:137楼 得分:10
    5.Server ser = new Server();            // new()出来的对象,没和session关联,应该是保存
      ser.setID(Integer.parseInt(request.getParameter("id")));  //没和session关联,设置的id被忽略
      ser.setTitle(request.getParameter("title"));
      ser.setContent(request.getParameter("content"));
      session.update(ser);    //其实是保存,一般不推荐这么做。保存就是保存,更新就该更新

      上面这些代码 对数据表进行更新 Server是一个pojo
        结果发现并没有对原始记录进行更新 也是另外新加了一条记录。
        这是咋回事呢?           
      不过我换成这样就能正常更新了:
      Server ser = session.get(Server.class,request.getParameter("id"));  // 对象和session关联
        ser.setID(Integer.parseInt(request.getParameter("id")));
      ser.setTitle(request.getParameter("title"));
      ser.setContent(request.getParameter("content"));
      session.update(ser); 

    要记得什么是update(),就是从数据库里取出数据,修改,这样才能算更新。可以理解为你要更新的那个对象必须是
    和session关联的,请看红色注释。如果你的对象是new()出来的,它还没和session关联,那么对它的update()操作
    会被理解为保存save()操作。

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-10-26 22:46:428楼 得分:0
    2.Hibernate 更新数据 把主键和要更新的数据封装到了pojo里
      我粗心把update写成了save 结果发现居然也更新了 而且数据库里没有出现也没有新增加一条记录 这是咋回事?

    不知道是不是和上面的情况一样。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-10-26 22:48:149楼 得分:10
    4.
            String str = "sdfdfddd\0123123";
            System.out.println(str);
            谁帮忙解释一下这两行代码的输出情况啊 主要是看不懂为什么会少输出几个字符
        由于\是转义字符,而\后接一到三位八进制的数,可表示ASCII中相应的字符,而\012是换行字符,所以
        输出结果为sdfdfddd
                3123

    第五题的理解是:使用update方法时,该方法中的参数要为持久化对象,或者脱管对象。你可以看一下Hibernate的帮助文档。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • johnsoncr
    • 等级:
    发表于:2007-10-26 22:49:1710楼 得分:20
    回复第七个问题:
      --> 移位操作符操作的运算对象是二进制的“位”,int类型是32位也就是2的5次幂 !如果移32位以上,那么原来的数的信息会全部丢失,这样也就没有什么意义了!所以上面的“只有右侧的5个低位才会有用”说的是:移位操作符右端的那个数(化成二进制)的低5位才有用,即
    X < <y;
    是指y的低5位才有用,即不能大于32。 而对于long型也是同样的道理!

    因此,如果对一个int 型,进行移位,X < <y; 当y小于32时,移位后的结果一般都在我们的预料当中;而如果y大于32时,由于移位超出了int所能表示的范围,这时就先把y化成二进制数,然后取该二进制数右端的低5位,再把这5位化成十进制,此时的这个十进制就是要对X移动的位数。

    例如:        int int a=140; 
                        a < < 34

                      System.out.println(Integer.toBinaryString(a < < b));

    上面那两个语句的执行过程是:先把a化成二进制数:10001100

    执行语句 a < < 34  对a左移32位时,先把 34化成二进制:100010,对该二进制数取右边5位,即00010,化成十进制数为2,所以实际上是对a左移两位。现在,地球人都会知道上面程序的输出结果是:1000110000

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-10-26 22:51:4311楼 得分:0
    3.用Hibernate对数据库进行查询 然后将结果保存在request到 forward到一个页面上去显示
        在显示以后 手动到数据库里加一条记录  这时刷新页面 并没有看到新增加的页面 。 只有把tomcat重起以后 再刷新 才能看到
      这是为啥  宝宝说可能是Hibernate缓存?

    我个人认为不是缓存的问题,我想hibernate的缓存做的不是那么差的。
    试着从自己的程序找原因,你的刷新操作有没有触发这个hibernate的查询操作呢?

    另一种可能会是IE的缓存的原因,意思就是当你刷新的时候IE并不去服务器重新取数据,但我还是觉得这
    种可能性很小。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-10-26 23:02:0012楼 得分:5
    别的问题这么多 我懒的看,一眼看到最后一个了 记得我以前看过 就粗略说说:

    移位操作符操作的是位,你把两端的数以二进制的形式来运算。低5位是指移位符号右侧二进制码的5个低位。因为2的5次方是32,也就是说5个低位最大可表示为32,也就是最大可以移32位。而int型只有32位。5个低位就够用了。所以“右端的低5位才有用”。。不知道这样解释是否明了?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-10-27 17:20:4413楼 得分:0
        由于\是转义字符,而\后接一到三位八进制的数,可表示ASCII中相应的字符,而\012是换行字符,所以
        输出结果为sdfdfddd
                3123

    ===============================================
    是不是还有表示其他相关操作的字符呢?
    \n 后面的n是不是char型,和\一起就成了换行符?

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-10-27 21:24:1614楼 得分:0
    最后一个问题已经明白 谢谢大家的回答 特别是wushui1215 和 johnsoncr

    请大家接着帮忙回答一下别的问题哈。

    特别是Hibernate的问题

    Server ser = session.get(Server.class,request.getParameter("id"));  // 对象和session关联

    我这样得到一个对象
    和Server ser = new Server(); 建的一个对象 程序怎么 知道哪个是和Session关联的而哪个又不是呢? 谢谢回答!@
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-10-27 21:53:2015楼 得分:0
    to  sharpyuce  你回答的几个问题的答案我都不是太满意
    第一个:你说的那些我知道 可是没有回答到我问的点上 可能是我没有表达清楚
            synchronized(obj) 
              {.......}  这个同步块 要得到obj的锁才能进入 如果我在这个同步块被线程a执行之前调用了另一个方法b  b并不是同步方法 并把obj传为参数

                  传了进去
              这时 我在b方法里对这个obj做什么操作 就算是得到了对象的锁 使的那个线程a不能进入同步块? 你说的进入synchronized修饰的方法就会得到锁 
                和没说一样嘛 对不?

    不知道你到底问的什么?你写个例子?对象的得锁与不得锁  说白了就是和其他同步线程之间的通信,你最好写个例子,或者说个具体实现,直接说怎么得到对象的锁,很抽象。。。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-10-27 22:20:5016楼 得分:0
    不知道你上面说的是不是这种同步:
    比如:
    Java code
    class A{ public synchronizied void m1(){ ................ } private Object object = new Object(); public void m2(){ synchronizied(object){} } } class ThreadA extends Thread{ private A a; public ThreadA(A a){ this.a = a; } public void run(){ a.m1(); } } public class TestThread{ public static void main(String[] args){ A a = new A(); Thread t = new ThreadA(a); t.start(); a.m2(); } } 上面的这种情况m1和m2这2个方法虽然是同步的,但是他们的锁不同,m1得到的是A的一个类对象(实例)的锁,而m2则是的到的synchronizied(object),object的锁,他们2个的同步是独立的,这中情况下,这2个线程不会产生阻塞状态。不知道说没说没明白,是不是你要所表达的意思
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-10-27 22:34:3817楼 得分:0
    汗 你说的那些我也知道
    我还是没有表达清楚么
    那个问题我主要想问的是:
    对一个对象做什么样的操作就有可能得到它的锁
    是不是只有调用这个对象的同步方法或者进入这个对象的同步块里才能得到这个对象的锁?除了这两种情况还有没有别的什么情况能得到这个对象的锁?

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-10-28 00:58:2518楼 得分:10
    特别是Hibernate的问题

    Server ser = session.get(Server.class,request.getParameter("id"));  // 对象和session关联

    我这样得到一个对象
    和Server ser = new Server(); 建的一个对象 程序怎么 知道哪个是和Session关联的而哪个又不是呢? 谢谢回答!@
    ######################################################################

    这个是hibernate的事情.
    你通过session得到的对象就是和session关联的了,由hibernate控制的.
    new()出来的对象就是还没关联,因为你没涉及到hibernate操作.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-10-28 13:57:3219楼 得分:0
    好多问题啊
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • FL1429
    • 等级:
    发表于:2007-10-28 14:26:5720楼 得分:0
    恩,这编帖子不错,让更多的人了解到自己基础的不足。。。。。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-10-28 17:53:4221楼 得分:0
    关于那个hibernate的问题,我有一些意见。
    update的确是要与session关联才可以的。new()出来的对象是没有关联,但是只要设置了ID,执行update方法时hibernate会去检查数据库是否有此ID的数据,如果有就会执行update方法。
    你出错的可能会不会是没有得到ID?或者你设置了version,此时你要update的话必须要得到ID和version两个参数才能执行。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ybm
    • 等级:
    发表于:2007-10-28 22:55:5822楼 得分:0
    问题1::旧版本的jdk有synchronized关键字,jdk1.5用ReentrantLock类
    基本结构为:

    Java code
    import java.util.concurrent.locks.*; //...... public static void main(String[] args) { // ...... Lock myLock=new ReentrantLock(); myLock.lock(); try{ //critical section; } finally{ myLock.unlock(); } //.....

    最好用finally这样unlock都能执行!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-10-29 02:08:3723楼 得分:0
    小弟能力有限,我所知道的就只能这样得到锁。
    关注!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-10-29 09:41:2124楼 得分:0
    楼主的知识真全面,按自己的理解说说,不对之处,莫怪...
    5.Server ser = new Server();
      ser.setID(Integer.parseInt(request.getParameter("id")));
      ser.setTitle(request.getParameter("title"));
      ser.setContent(request.getParameter("content"));
      session.update(ser);

      上面这些代码 对数据表进行更新 Server是一个pojo
        结果发现并没有对原始记录进行更新 也是另外新加了一条记录。
        这是咋回事呢?
      不过我换成这样就能正常更新了:
      Server ser = session.get(Server.class,request.getParameter("id"));
        ser.setID(Integer.parseInt(request.getParameter("id")));
      ser.setTitle(request.getParameter("title"));
      ser.setContent(request.getParameter("content"));
      session.update(ser);


    hibernate 每一个对象对应数据库中一条数据,你新实例化一个对象当然是新建立了一条数据.

    6. 在做一个swing小东西时发现的问题
        界面上有50多个JLabel 我要循环设置每个JLabel的Text属性的值 。
      难道 要把每个label都加到集合里 然后再循环吗 这样是不是太麻烦 如果是上百个咋办呢? 有什么方法能方便一点呢? 好像用反射可以做到?


    呵呵 楼主一说循环,我的第一反映就是for循环,假设50个JLabel,把JLabel命名为jlabel1....jlabel50
    for(int i=1;i <51;i++)
    {
      ....
    }

    7.Java编程思想上写到: < < 只有对数值右端的5位才有用 这样可以防止我们移位超过int类型所具有的位数
      这句话是什么意思啊。/ 为什么超过5位就会超过int类型所具有的位数呢?


    楼上的已经说的很明白了,我只是想补充一下,其实不用像楼上那样转来转去的,直接用移位数对32取模就行了,比如要移34位,34%32 结果是2,就移2位就行了.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wewaa
    • 等级:
    发表于:2007-10-29 13:29:5725楼 得分:0
    up
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-10-29 14:06:1826楼 得分:0
    update()这个方法生成的update的SQL语句。它只能用于持久化的对象和游离状态的对象。而

    server ser=new server(); 这个ser是自由状态的,它不能用update,只能用save()方法或者

    saveOrUpdate()方法。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-10-29 15:51:5027楼 得分:0
    JF
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-10-29 16:57:0528楼 得分:0
    pc_wang说到:
    关于那个hibernate的问题,我有一些意见。
    update的确是要与session关联才可以的。new()出来的对象是没有关联,但是只要设置了ID,执行update方法时hibernate会去检查数据库是否有此ID的数据,如果有就会执行update方法。
    你出错的可能会不会是没有得到ID?或者你设置了version,此时你要update的话必须要得到ID和version两个参数才能执行。
    *****************************************************************
    你说的是对的。我的理解有误。
    修改 删除 举报 引用 回复