随笔-124  评论-194  文章-0  trackbacks-0
 

用C++和JS的类来类比如下:

C++              JS
类                 一个function(也是一个对象,即名称-属性集合),因为它实际定义了一个类,所以又叫constructor

成员函数     constructor的属性prototype对象里定义,这样用constructor来new的对象都会继承它
成员            在constructor中用this.xxx赋值的一般属性
静态成员     直接function的名字"."赋值
多重继承      constructor.prototype = new SuperClass (),这样新定义的constructor的prototype继承了SuperClass的prototype,但要用constructor.prototype.constructor = constructor,把构造函数赋成新的constructor

所以说白了,JS的类就是一个函数对象。JS自动为它创建了属性prototype,可以被new出来的对象继承。
posted @ 2007-05-13 18:01 我爱佳娃 阅读(616) | 评论 (0)编辑 收藏
例如:表示主机HOST含有多个磁盘DISK关系:

在PD的OOM中双击一条关系连线,设置Navigate,这样才会在各自hbm.xml中生成many-to-one及one-to-many关系。



另外,根据“附文”的效率说明还需要设置:由多方DISK维护关系,并且当HOST更新时,也要更新DISK。



生成的HBM.XML如下:
HOST的:
      <joined-subclass name="Host" table="host" dynamic-update="false" dynamic-insert="false" select-before-update="false" lazy="true" abstract="false"> 
       <key on-delete="noaction" unique="true">
         <column name="dev_id" sql-type="int" not-null="true" length="0"/>
       </key>
       <array name="nic" optimistic-lock="true">
        <key on-delete="noaction" unique="true">
         <column name="dev_id" sql-type="int" not-null="false" length="0"/>
        </key>
        <list-index column="IndexColumnB"/>
        <one-to-many class="eb.nms.db.Nic"/>
       </array>
       <set name="disk" outer-join="false" inverse="true" lazy="true" optimistic-lock="true" cascade="save-update">
        <key on-delete="noaction" unique="true">
         <column name="dev_id" sql-type="int" not-null="false" length="0"/>
        </key>
        <one-to-many class="eb.nms.db.Disk"/>
       </set>
      </joined-subclass>


DISK的:
   <class name="Disk" table="disk" mutable="true" lazy="true" abstract="false">
      <id name="diskId">
         <column name="disk_id" sql-type="int" not-null="true"/>
         <generator class="native">  
         </generator>
      </id>
      <property name="diskName" insert="true" update="true" optimistic-lock="true">
         <column name="disk_name" sql-type="varchar(254)" length="254"/>
      </property>
      <many-to-one name="host" class="Host" outer-join="false" update="true" insert="true">
       <column name="dev_id" sql-type="int" not-null="false" length="0"/>
      </many-to-one>
   </class>


附文:
 

Hibernate Gossip: 雙向關聯(inverse 的意義)

多對一 一對多 中都是單向關聯,也就是其中一方關聯到另一方,而另一方不知道自己被關聯。

如果讓雙方都意識到另一方的存在,這就形成了雙向關聯,在多對一、一對多的例子可以改寫一下,重新設計User類別如下:

  • User.java

package onlyfun.caterpillar;

public class User {
    private Integer id;
    private String name;
    private Room room;
 
    public User() {}

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Room getRoom() {
        return room;
    }

    public void setRoom(Room room) {
        this.room = room;
    }
}


Room
類別如下:

  • Room.java

package onlyfun.caterpillar;

import java.util.Set;

public class Room {
    private Integer id;
    private String address;
    private Set users;
 
    public Room() {}
 
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }
 
    public String getAddress() {
        return address;
    }
 
    public void setAddress(String address) {
        this.address = address;
    }

    public Set getUsers() {
        return users;
    }

    public void setUsers(Set users) {
        this.users = users;
    }
 
    public void addUser(User user) {
        users.add(user);
    }
 
    public void removeUser(User user) {
        users.remove(user);
    }
}


如此,User實例可參考至Room實例而維持多對一關係,而Room實例記得User實例而維持一對多關係。

在映射文件方面,可以如下撰寫:

  • User.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="onlyfun.caterpillar.User" table="user">
        <id name="id" column="id" type="java.lang.Integer">
            <generator class="native"/>
        </id>

        <property name="name" column="name" type="java.lang.String"/>
 
        <many-to-one name="room"
                     column="room_id"
                     class="onlyfun.caterpillar.Room"
                     cascade="save-update"
                     outer-join="true"/>
    </class>

</hibernate-mapping>

 

  • Room.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="onlyfun.caterpillar.Room" table="room">
        <id name="id" column="id">
            <generator class="native"/>
        </id>

        <property name="address"
                  column="address"
                  type="java.lang.String"/>
 
        <set name="users" table="user" cascade="save-update">
            <key column="room_id"/>
            <one-to-many class="onlyfun.caterpillar.User"/>
        </set>
    </class>

</hibernate-mapping>


映射文件雙方都設定了cascadesave-update,所以您可以用多對一的方式來維持關聯:

User user1 = new User();
user1.setName("bush");
       
User user2 = new User();
user2.setName("caterpillar");

Room room1 = new Room();
room1.setAddress("NTU-M8-419");

user1.setRoom(room1);
user2.setRoom(room1);
       
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
       
session.save(user1);
session.save(user2);

tx.commit();
session.close();


或是反過來由一對多的方式來維持關聯:

User user1 = new User();
user1.setName("bush");
       
User user2 = new User();
user2.setName("caterpillar");

Room room1 = new Room();
room1.setUsers(new HashSet());
room1.setAddress("NTU-M8-419");
room1.addUser(user1);
room1.addUser(user2);
       
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
       
session.save(room1);

tx.commit();
session.close();


這邊有個效率議題可以探討,上面的程式片段Hibernate將使用以下的SQL進行儲存:

Hibernate: insert into room (address) values (?)
Hibernate: insert into user (name, room_id) values (?, ?)
Hibernate: insert into user (name, room_id) values (?, ?)
Hibernate: update user set room_id=? where id=?
Hibernate: update user set room_id=? where id=?


上面的程式寫法表示關聯由Room單方面維持,而主控方也是RoomUser不知道Roomroom_id是多少,所以必須分別儲存Room User之後,再更新userroom_id

在一對多、多對一形成雙向關聯的情況下,可以將關聯維持的控制權交給多的一方,這樣會比較有效率,理由不難理解,就像是在公司中,老闆要記住多個員工的姓名快,還是每一個員工都記得老闆的姓名快。

所以在一對多、多對一形成雙向關聯的情況下,可以在「一」的一方設定控制權反轉,也就是當儲存「一」的一方時,將關聯維持的控制權交給「多」的一方,以上面的例子來說,可以設定Room.hbm.xml如下:

  • Room.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="onlyfun.caterpillar.Room" table="room">
        <id name="id" column="id">
            <generator class="native"/>
        </id>

        <property name="address"
                  column="address"
                  type="java.lang.String"/>
 
        <set name="users" table="user" cascade="save-update" inverse="true">
            <key column="room_id"/>
            <one-to-many class="onlyfun.caterpillar.User"/>
        </set>
    </class>

</hibernate-mapping>


由於關聯的控制權交給「多」的一方了,所以直接儲存「一」方前,「多」的一方必須意識到「一」的存在,所以程式片段必須改為如下:

User user1 = new User();
user1.setName("bush");
       
User user2 = new User();
user2.setName("caterpillar");

Room room1 = new Room();
room1.setUsers(new HashSet());
room1.setAddress("NTU-M8-419");
room1.addUser(user1);
room1.addUser(user2);

//
多方必須意識到單方的存在
user1.setRoom(room1);

user2.setRoom(room1);
       
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
       
session.save(room1);

tx.commit();
session.close();


上面的程式片段Hibernate將使用以下的SQL

Hibernate: insert into room (address) values (?)
Hibernate: insert into user (name, room_id) values (?, ?)
Hibernate: insert into user (name, room_id) values (?, ?)


如果控制權交給另一方了,而另一方沒有意識到對方的存在的話會如何?試著將上面的程式片段中user1.setRoom(room1); user2.setRoom(room1);移去,執行之後,您會發現資料庫中room_id會出現null值,這種結果就好比在 多對一 中,您沒有分配給User一個Room,理所當然的,room_id會出現null

 

posted @ 2007-04-15 17:17 我爱佳娃 阅读(6439) | 评论 (0)编辑 收藏

 

http://macrochen.blogdriver.com/macrochen/687759.html
posted @ 2007-04-15 15:06 我爱佳娃 阅读(886) | 评论 (0)编辑 收藏

执行:New->Conceptual Data Model
编译完概念模型后,再通过CDM生成PDM和OOM,注意要先生成OOM,再生成PDM。
在3种模型都具备时,生成JAVA CODE时才会有*.hbm.xml文件:

执行:Tools->Generate Object-Oriented Model
在对话框中,选择Detail,勾选O/R Mapping,点击Enable Transformations,在多出来的选项卡Extended Model Definitions中的O/R Mapping页中选择Hibernate。

执行:Tools->Generate Physical Data Model
在对话框中,选择Detail,勾选O/R Mapping,点击Enable Transformations,在多出来的选项卡Extended Model Definitions中的O/R Mapping页中选择Hibernate。

再执行:Language->Generate Java Code

就会看见生成的JAVA代码和映射HBM.XML文件

这里只是刚刚摸索的一些步骤,如果有实际用过,或者有详细资料的XDJM,请回复出来共享下。多谢。
PD的帮助让人摸不着头脑。

这是最后结果:

posted @ 2007-04-07 15:25 我爱佳娃 阅读(9847) | 评论 (11)编辑 收藏

解决方案:针对windows xp


1. 运行gpedit.msc到组策略管理界面下,计算机配置--->Winsows设置----->安全设置--->本地策略--->用户权利指派,看看右边有一行:"拒绝从网络访问这台计算机 "看它的属性里有没有guest一项,若有,则删除.


2. 若还不行,在我的电脑窗口里 工具--->文件夹选项---->查看----->高级选项里有"使用简单文件共享" 打勾去掉,确定下去,.然后再访问.


3. 启用 Guest、修改安全策略允许Guest从网络访问、禁用3里面的安全策略或者给Guest
加个密码。

http://hi.baidu.com/zhangqiguang123/blog/item/00882ff440c6d3ee7609d7f3.html
posted @ 2007-04-07 11:09 我爱佳娃 阅读(344) | 评论 (0)编辑 收藏

 

regex_t rt1_;

 
int cflags = RE_SYNTAX_AWK;
 cflags 
&= ~REG_NOSUB;
 
 
if (regcomp (&rt1_, // match: Interesting ports on 10.45.8.12:
  "([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\.([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\.([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\.([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])"
  cflags) 
!= 0)
 
{
     ulogEx(ULOG_LL_WARNING, MESW_DEV_NM,MON_ULOG_MID,MON_ULOG_EC_TRACE,
      
"%s: reg comp error!\n\n", __func__);
 }



 
static char ip [32];

 regmatch_t rm [
1];
 memset (
&rm, 0sizeof rm);
 
if (0 == regexec (&rt1_, pline, 1, rm, 0))
 

  strncpy (ip, 
&pline[rm[0].rm_so], rm[0].rm_eo-rm[0].rm_so+1);
  ip [rm[
0].rm_eo-rm[0].rm_so] = '\0';
  
  
return ip;
 }

 
else
  
return NULL;


 regfree (
&rt1_);
posted @ 2007-04-04 16:47 我爱佳娃 阅读(2697) | 评论 (0)编辑 收藏
     摘要: 为了大家能更好使用象ECLIPSE这种“巨无霸”(且不断在增长)。网上看的可以优化XP的文章,并自己写了一个脚本文件来停止服务,避免大家一个个去改麻烦。我试了可以,大概停了10多个服务。但有问题别找我呀!俺也不懂的说。 停止不用的服务bat命令 Code highlighting produced by Actip...  阅读全文
posted @ 2007-04-01 14:00 我爱佳娃 阅读(11655) | 评论 (2)编辑 收藏
     摘要: http://blog.csdn.net/sunjavaduke/archive/2007/03/15/1530069.aspx     <target name="sh" depends="compile">     <exec command="sh ./runsvr.sh" failonerror="false"/>    </target>...  阅读全文
posted @ 2007-03-22 09:43 我爱佳娃 阅读(3281) | 评论 (0)编辑 收藏

归纳一些网上取JAVA路径的方法:

注明:如果从ANT启动程序,this.getClass().getResource("")取出来的比较怪,直接用JAVA命令行调试就可成功。
 
得到classpath和当前类的绝对路径的一些方法

         获得CLASSPATH之外路径的方法:
         URL base = this.getClass().getResource(""); //先获得本类的所在位置,如/home/popeye/testjava/build/classes/net/
         String path = new File(base.getFile(), "../../../"+name).getCanonicalPath(); //就可以得到/home/popeye/testjava/name

  下面是一些得到classpath和当前类的绝对路径的一些方法。你可能需要使用其中的一些方法来得到你需要的资源的绝对路径。

  1.FileTest.class.getResource("")

  得到的是当前类FileTest.class文件的URI目录。不包括自己!

  如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/com/test/

  2.FileTest.class.getResource("/")

  得到的是当前的classpath的绝对URI路径。

  如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/

  3.Thread.currentThread().getContextClassLoader().getResource("")

  得到的也是当前ClassPath的绝对URI路径。

  如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/

  4.FileTest.class.getClassLoader().getResource("")

  得到的也是当前ClassPath的绝对URI路径。

  如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/

  5.ClassLoader.getSystemResource("")

  得到的也是当前ClassPath的绝对URI路径。

  如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/

  我推荐使用Thread.currentThread().getContextClassLoader().getResource("")来得到当前的classpath的绝对路径的URI表示法。

    在Web应用程序中,我们一般通过ServletContext.getRealPath("/")方法得到Web应用程序的根目录的绝对路径。这样,我们只需要提供相对于Web应用程序根目录的路径,就可以构建出定位资源的绝对路径。
   
   


注意点:
    1.尽量不要使用相对于System.getProperty("user.dir")当前用户目录的相对路径。这是一颗定时炸弹,随时可能要你的命。

  2.尽量使用URI形式 
的绝对路径资源。它可以很容易的转变为URI,URL,File对象。

  3.尽量使用相对classpath的相对路径。不要使用绝对路径。使用上面ClassLoaderUtil类的public static URL getExtendResource(String relativePath)方法已经能够使用相对于classpath的相对路径定位所有位置的资源。

  4.绝对不要使用硬编码的绝对路径。因为,我们完全可以使用ClassLoader类的getResource("")方法得到当前classpath的绝对路径。

使用硬编码的绝对路径是完全没有必要的!它一定会让你死的很难看!程序将无法移植!

  如果你一定要指定一个绝对路径,那么使用配置文件,也比硬编码要好得多!

  当然,我还是推荐你使用程序得到classpath的绝对路径来拼资源的绝对路径

posted @ 2007-03-21 11:43 我爱佳娃 阅读(4750) | 评论 (2)编辑 收藏

inverse,表示两个表的关系由谁维护。值为false的一方将维护这种关系。如下面多对多关系中,由HOST来维护它们之间的关系表hostalarmrule。

cascade,表示更新本表时,是否附带更新与其相关的其它表。如下面,更新HOST表,由于值为save-update,也会将rules增加或者更新到ALARMRULE表;但,删除HOST时,不会删除ALARMRULE表中数据。除非,其值为all。

    <class name="db.Host" table="host" catalog="rw">
        <set name="rules" inverse="false" table="hostalarmrule" cascade="save-update">
            <key column="host_id"/>
            <many-to-many class="db.Alarmrule" column="alarmrule_id"/>
        </set>               
    </class>

    <class name="db.Alarmrule" table="alarmrule" catalog="rw">
      <set name="hosts" table="hostalarmrule" inverse="true">
            <key column="alarmrule_id"/>
            <many-to-many class="db.Host" column="host_id"/>
        </set>
    </class>

posted @ 2007-03-13 21:17 我爱佳娃 阅读(466) | 评论 (0)编辑 收藏
仅列出标题
共13页: First 上一页 5 6 7 8 9 10 11 12 13 下一页