用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>
附文:
在 多對一 、一對多 中都是單向關聯,也就是其中一方關聯到另一方,而另一方不知道自己被關聯。
如果讓雙方都意識到另一方的存在,這就形成了雙向關聯,在多對一、一對多的例子可以改寫一下,重新設計User類別如下:
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類別如下:
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實例而維持一對多關係。
在映射文件方面,可以如下撰寫:
<?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>
<?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>
映射文件雙方都設定了cascade為save-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單方面維持,而主控方也是Room,User不知道Room的room_id是多少,所以必須分別儲存Room與 User之後,再更新user的room_id。
在一對多、多對一形成雙向關聯的情況下,可以將關聯維持的控制權交給多的一方,這樣會比較有效率,理由不難理解,就像是在公司中,老闆要記住多個員工的姓名快,還是每一個員工都記得老闆的姓名快。
所以在一對多、多對一形成雙向關聯的情況下,可以在「一」的一方設定控制權反轉,也就是當儲存「一」的一方時,將關聯維持的控制權交給「多」的一方,以上面的例子來說,可以設定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, 0, sizeof 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) |
编辑 收藏