JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Object Relational Mapping » Hibernate  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to topicthreaded modego to previous topicgo to next topic
話題被移動
該話題已被移動 - browser , 2003-07-16 02:07
如果您尚不清楚該話題被移動的原因,請參考論壇規則以及本版公告或者聯系本版版主。
本主題所含的標籤
無標籤
作者 hibernate 快速入門 [精華]
ray_linn

什么都不懂的小白

版主

發文: 540
積分: 10
於 2003-07-15 16:21 user profilesend a private message to usersend email to ray_linnreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
本文旨在用例子給出大概輪廓(很省時間),具體請參考其自帶的優秀文檔。

參考:一群牛人關於jdo和ejb的討論:Java object models debated 其中也提到了此開源專案。


1. 一個簡單的例子 --- 我們開發一個Person類:
Person
{
name:String
address:String
id:String
}

要通過hibernate實現它要經過以下步驟:

主要是先根據物件模型編寫簡單的業務實體類(簡單的bean規範類,即有get,set方法的類,可以用jac等工具生成),再用xml映射文件描述其映射資料庫的方式(很easy),最後就可以通過很少的hibernate api寫測試類對其進行持久化操作。

1.1
寫Person類(Persistent Object),它和普通的類沒甚末不同,但注意它應該複合bean的規範,爲每個屬性提供get,set方法:
package h;
public class Person
{
String name
public void setName(String value)
{ this.name=value; }
public String getName()
{ return name; }
String address;
public void setAddress(String value)
{ this.address=value; }
public String getAddress()
{ return address; }
String id;
public void setId(String value)
{ this.id=value; }
public String getId()
{ return id; }
}

1.2 填寫物件-關係映射xml文件,不用擔心它的複雜程度,我們可以抄嘛:
和所有o-r 映射工具一樣都要寫這種映射文件。

Person.hbm.xml
建議命名爲:"類名"+"hbm.xml" 並且放置在Person類相同包目錄下
<?xml version="1.0" encoding="GB2312"?>
<!DOCTYPE hibernate-mapping SYSTEM "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >
<hibernate-mapping>  
<class name="h.Person">
   <!--hibernate爲我們生成主鍵id-->
    <id name = "id" unsaved-value = "null">
      <generator class="uuid.hex"/>
    </id>
       <!--默認把類的變數映射爲相同名字的表列,當然我們可以修改其映射方式-->
    <property name="name"/>
    <property name="address"/>
  </class>
</hibernate-mapping> 

1.3 TestPerson 我們用hibernate api來進行持久化Person

h.TestPerson
package h;
import net.sf.hibernate.Session;
import net.sf.hibernate.Transaction;
import net.sf.hibernate.SessionFactory;
import net.sf.hibernate.cfg.Configuration;
import net.sf.hibernate.tool.hbm2ddl.SchemaExport;
class TestPerson{   
private static SessionFactory sessions;
public static void main(String[] args) throws Exception{
     //配置環境,分析xml映射文件
  Configuration conf= new Configuration()
    .addClass(Person.class);
//生成並輸出sql到文件(當前目錄)和資料庫
SchemaExport dbExport=new SchemaExport(conf);
dbExport.setOutputFile("build\\sql.txt");
dbExport.create(true, true);
    sessions = conf.buildSessionFactory();
//以上都是些固定格式的環境配置
//start......
Session s = sessions.openSession();
    Transaction t = s.beginTransaction();   //1.用普通使用方式建立物件,填充資料
   Person p1=new Person();
   p1.setName("陳鵬");
   p1.setAddress("西安東郊黃陵");
   //2.持久化
   s.save(p1);
    //此時p1已經可以在資料庫中找到
   t.commit();
   s.close();
}} 

1.4 爲了運行當然要配置資料庫:我以mysql資料庫爲例子:(只用勞動1次即可)

hibernate.properties 在hibernate根源程式的根目錄可以找到此文件模板,copy到我們的類的根目錄。即:“..\h”

## MySQL## 前兩行人家都給你填好了,只用填資料庫連接和username,password
hibernate.dialect net.sf.hibernate.dialect.MySQLDialect
hibernate.connection.driver_class org.gjt.mm.mysql.Driver
hibernate.connection.url jdbc:mysql://localhost/test?useUnicode=true&characterEncoding=GBK
hibernate.connection.username roothibernate.connection.password

1.5 運行TestPerson類,在mysql中觀察create好的表person和其中的資料
ok!整個過程主要的是前3步:寫bean類(Persistent Object),寫o-r映射文件,寫存取測試類。


reply to postreply to post
飞翔的候鸟
作者 Re:hibernate 快速入門 [Re:ray_linn]
ray_linn

什么都不懂的小白

版主

發文: 540
積分: 10
於 2003-07-15 16:30 user profilesend a private message to usersend email to ray_linnreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
2. 複雜關係例子

我們換一個稍微複雜的例子來看看:

表person
id(primary key)  company_id  name  address
000000001  000000002  陳鵬  西安
          
表Company
id(primary key)  name
000000002  東軟
...   

兩個表之間通過id相關聯。

2.1 Person(已有),Company類:Persistent Object
h.Company

package h;
public class Company {
String id;
public void setId(String value) {
this.id=value;
}
public String getId() {
return id;
}
String name;
public void setName(String value) {
this.name=value;
}
public String getName() {
return name;
}
java.util.List employees=new java.util.Vector();
public void setEmployees(java.util.List value) {
this.employees=value;
}
public java.util.List getEmployees() {
return employees;
}
public void addEmployee(h.Person value) {
employees.add(value);
}
public void removeEmployee(h.Person value) {
employees.remove(value);
}
public void clearEmployees() {
employees.clear();
}
} 

2.2 填寫物件-關係映射xml文件,Person.hbm.xml照舊
Company.hbm.xml 也放到h.Company類相同目錄下
<?xml version="1.0" encoding="GB2312"?>
<!DOCTYPE hibernate-mapping SYSTEM "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >
<hibernate-mapping>
  <class name="h.Company">
   <!--hibernate爲我們生成主鍵id-->
    <id name = "id" unsaved-value = "null">
      <generator class="uuid.hex"/>
    </id>
     <property name="name"/>
   <!--1:n關係的映射-->
   <list name="employees" cascade="all">
<key column="company_id"/>
<index column="posn"/>
<one-to-many class="h.Person"/>
</list>
</class>
</hibernate-mapping>
 
2.3 TestCompany 我們用hibernate api來進行持久化Person,Company

package h;
import net.sf.hibernate.Session;import net.sf.hibernate.Transaction;
import net.sf.hibernate.SessionFactory;
import net.sf.hibernate.cfg.Configuration;
import net.sf.hibernate.tool.hbm2ddl.SchemaExport;
class TestCompany{
  private static SessionFactory sessions;
public static void main(String[] args) throws Exception{
     //配置環境,分析xml映射文件
  Configuration conf= new Configuration()
      .addClass(Person.class)      .addClass(Company.class);
//生成並輸出sql到文件(當前目錄)和資料庫
SchemaExport dbExport=new SchemaExport(conf);
dbExport.setOutputFile("build\\sql.txt");
dbExport.create(true, true);
    sessions = conf.buildSessionFactory();
//以上都是些固定格式的環境配置
//start......
Session s = sessions.openSession();
    Transaction t = s.beginTransaction();
      //1.用普通方式建立物件,填充資料
   Company c=new Company();
   c.setName("東軟");
      Person p1=new Person();
   p1.setName("陳鵬");
   p1.setAddress("西安東郊黃陵");  
Person p2=new Person();
   p2.setName("孫昱鵬");
   p2.setAddress("南郊電子城");
      c.addEmployee(p1);
   c.addEmployee(p2);  
   //2.持久化
   s.save(c);
    //此時c,p1,p2已經可以在資料庫中找到
   t.commit();
   s.close();
}} 
2.4 不用再配置資料庫了。
2.5 運行TestCompany類,在mysql中觀察create好的表person和Company其中的資料.
總結:
這個只展現了極爲簡單的2個持久化例子,更多的1:1,1:n,m:n等的物件模型的實現請看hibernate附帶的文檔,越是複雜的模型越能體現其威力。


browser edited on 2003-08-06 21:19
reply to postreply to post
飞翔的候鸟
作者 Re:hibernate 快速入門 [Re:ray_linn]
imdragon



發文: 0
積分: 0
於 2003-07-16 09:48 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
可否請問一下...
<generator class="uuid.hex"/>
後面那個 class 有很多的參數可以設定,
是否可以說明一下可參數的用塗用差異勒...
因為hibernate它的pk key都是自己產生的...
將來這樣會不會有key的問題存在呢?

另外一個就是它的update...
好像的做法是先把資料找出來再做修改...


reply to postreply to post
作者 Re:hibernate 快速入門 [Re:ray_linn]
ray_linn

什么都不懂的小白

版主

發文: 540
積分: 10
於 2003-07-16 12:14 user profilesend a private message to usersend email to ray_linnreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
The required <generator> child element names a Java class used to generate unique identifiers for instances of the persistent class. If any parameters are required to configure or initialize the generator instance, they are passed using the <param> element.

<id name="id" type="long" column="uid" unsaved-value="0">
<generator class="net.sf.hibernate.id.TableHiLoGenerator">
<param name="table">uid_table</param>
<param name="column">next_hi_value_column</param>
</generator>
</id>

All generators implement the interface net.sf.hibernate.id.IdentifierGenerator. This is a very simple interface; some applications may choose to provide their own specialized implementations. However, Hibernate provides a range of built-in implementations. There are shortcut names for the built-in generators:

increment
generates identifiers of type long, short or int that are unique only when no other process is inserting data into the same table. Do not use in a cluster.

identity
supports identity columns in DB2, MySQL, MS SQL Server, Sybase and HypersonicSQL. The returned identifier is of type long, short or int.

sequence
uses a sequence in DB2, PostgreSQL, Oracle, SAP DB, McKoi or a generator in Interbase. The returned identifier is of type long, short or int

hilo
uses a hi/lo algorithm to efficiently generate identifiers of type long, short or int, given a table and column (by default hibernate_unique_key and next respectively) as a source of hi values. The hi/lo algorithm generates identifiers that are unique only for a particular database. Do not use this generator with connections enlisted with JTA or with a user-supplied connection.

seqhilo
uses a hi/lo algorithm to efficiently generate identifiers of type long, short or int, given a named database sequence.

uuid.hex
uses a 128-bit UUID algorithm to generate identifiers of type string, unique within a network (the IP address is used). The UUID is encoded as a string of hexadecimal digits of length 32.

uuid.string
uses the same UUID algorithm. The UUID is encoded a string of length 16 consisting of (any) ASCII characters. Do not use with PostgreSQL.

native
picks identity, sequence or hilo depending upon the capabilities of the underlying database.

assigned
lets the application to assign an identifier to the object before save() is called.

foreign
uses the identifier of another associated object. Used in conjunction with a <one-to-one> association.


reply to postreply to post
飞翔的候鸟
作者 Re:hibernate 快速入門 :O) [Re:ray_linn]
victorpen





發文: 25
積分: 0
於 2004-03-23 19:56 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
ShockShock
請問一下... run TestPerson 出現問題 , 什麼

sessions = conf.buildSessionFactory();
//以上都是些固定格式的環境配置
//start......
Session s = sessions.openSession();
Transaction t = s.beginTransaction(); //1.用普通使用方式建立物件,填充資料
Person p1=new Person();
p1.setName("陳鵬");
p1.setAddress("西安東郊黃陵");
//2.持久化
s.save(p1);
//此時p1已經可以在資料庫中找到
t.commit();
s.close();

.......
資訊: Query language substitutions: {}
2004/3/23 下午 07:47:50 net.sf.hibernate.cfg.SettingsFactory buildSettings
資訊: cache provider: net.sf.ehcache.hibernate.Provider
net.sf.hibernate.HibernateException: could not instantiate CacheProvider: net.sf.ehcache.hibernate.Provider
  at net.sf.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:133)
  at net.sf.hibernate.cfg.Configuration.buildSettings(Configuration.java:1119)
  at net.sf.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:748)
  at TestPerson.main(TestPerson.java:21)
Caused by: java.lang.ClassNotFoundException: net.sf.ehcache.hibernate.Provider
  at java.net.URLClassLoader$1.run(URLClassLoader.java:198)
  at java.security.AccessController.doPrivileged(Native Method)
  at java.net.URLClassLoader.findClass(URLClassLoader.java:186)
  at java.lang.ClassLoader.loadClass(ClassLoader.java:299)
  at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:265)
  at java.lang.ClassLoader.loadClass(ClassLoader.java:255)
  at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:315)
  at java.lang.Class.forName0(Native Method)
  at java.lang.Class.forName(Class.java:140)
  at net.sf.hibernate.util.ReflectHelper.classForName(ReflectHelper.java:86)
  at net.sf.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:130)
  ... 3 more
Exception in thread "main"


reply to postreply to post
作者 Re:hibernate 快速入門 :O) [Re:victorpen]
victorpen





發文: 25
積分: 0
於 2004-03-24 17:12 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
請問一下... run TestPerson 出現問題 ,
我用 eclipse 3.0 環境
什麼 JNDI 設定在 ?地方?

資訊: building session factory
2004/3/24 下午 05:04:31 net.sf.hibernate.impl.SessionFactoryObjectFactory addInstance
資訊: no JNDI name configured
java.lang.NoClassDefFoundError: javax/transaction/Synchronization
  at net.sf.hibernate.impl.SessionFactoryImpl.openSession(SessionFactoryImpl.java:312)
  at net.sf.hibernate.impl.SessionFactoryImpl.openSession(SessionFactoryImpl.java:325)
  at net.sf.hibernate.impl.SessionFactoryImpl.openSession(SessionFactoryImpl.java:333)
  at TestPerson.main(TestPerson.java:27)
Exception in thread "main"


reply to postreply to post
作者 Re:hibernate 快速入門 [Re:ray_linn]
belliwu





發文: 1
積分: 0
於 2004-06-03 11:11 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
將 hibernate 2.1.3 lib 目錄架下的 jta.jar 檔複製到你專案的 classpath 下,重新建置應可解決你的問題

reply to postreply to post
作者 Re:hibernate 快速入門 [Re:ray_linn]
tomyoung





發文: 8
積分: 0
於 2004-11-18 02:21 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
我按照您的簡單例子重作一遍,結果發生下面Exception:
1
2
3
4
5
6
7
Exception in thread "main" net.sf.hibernate.hibernateException:
The dialect was not set. Set property hibernate.dialect.
  at net.sf.hibernate.dialect.Dialect.getDialect(Dialect.java:354)
  at net.sf.hibernate.dialect.Dialect.getDialect(Dialect.java:375)
  at net.sf.hibernate.tool.hbm2ddl.SchemaExport<init>(SchemaExport.java:57)
  at net.sf.hibernate.tool.hbm2ddl.SchemaExport<init>(SchemaExport.java:48)
  at TestPerson.main(TestPerson.java:18)


我認為是程式沒讀到hibernate.properties的hibernate.dialect.
所以, 查了一下我的hibernate.properties是這樣:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
## HypersonicSQL
 
hibernate.dialect net.sf.hibernate.dialect.HSQLDialect
hibernate.connection.driver_class org.hsqldb.jdbcDriver
hibernate.connection.username sa
hibernate.connection.password
hibernate.connection.url jdbc:hsqldb:hsql://localhost
hibernate.connection.url jdbc:hsqldb:test
hibernate.connection.url jdbc:hsqldb:.
 
## PostgreSQL
 
hibernate.dialect net.sf.hibernate.dialect.PostgreSQLDialect
hibernate.connection.driver_class org.postgresql.Driver
hibernate.connection.url jdbc:postgresql://localhost:5432/20041115_db
hibernate.connection.username postgres
hibernate.connection.password
#hibernate.query.substitutions yes 'Y', no 'N'
 


後來,我改用hibernate.cfg.xml, 設定如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!DOCTYPE hibernate-configuration PUBLIC
  "-//Hibernate/Hibernate Configuration DTD//EN"
  "http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd">
<hibernate-configuration>
  <session-factory>
 
    <property name="show_sql">false</property>
    <property name="hibernate.dialect">net.sf.hibernate.dialect.PostgreSQLDialect</property>
    <property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
    <property name="hibernate.connection.url">
      jdbc:postgresql://localhost:5432/20041115_db?useUnicode=true&characterEncoding=Big5
    </property>
    <property name="hibernate.connection.username">postgres</property>
    <property name="hibernate.connection.password"></property>
    <!-- Mapping files -->
    <mapping resource="Person.hbm.xml" />
 
</session-factory>
</hibernate-configuration>


但仍然發生同樣的Exception, 請問到底發生什麼事了?

我的環境是:
Fedora Core 1
netbeans3.6
j2sdk1.4.2_04
PostgreSQL7.3
Hibernate2.1.6


reply to postreply to post
作者 Re:hibernate 快速入門 [Re:ray_linn]
todayhill





發文: 25
積分: 0
於 2004-11-18 21:28 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
是不是你的配置文件根本就没有读到?你的代码目录结构是怎么组织的?

reply to postreply to post
作者 Re:hibernate 快速入門 [Re:ray_linn]
tomyoung





發文: 8
積分: 0
於 2004-11-18 22:54 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
為了簡化練習起見, 我並沒使用package.
文件配置如下:
------------
|_Person.class
|_TestPerson.class
|_Person.hbm.xml
|_hibernate.properties
|_hibernate.cfg.xml

全部放在同一目錄下.

我認為可能program沒有讀到hibernate.properties & hibernate.cfg.xml,
所以, 做了另一項測試, 發現另外一個問題:
http://www.javaworld.com.tw/jute/post/view?bid=10&id=80462&sty=1&tpg=1&age=0

最後, 我修改了程式, 把 program
1
Configuration conf = new Configuration().addClass(Person.class);

改成
1
2
Configuration conf = new Configuration()
  .configure("/root/hibernate.properties").addClass(Person.class);


1
2
Configuration conf = new Configuration()
  .configure("/root/hibernate.cfg.xml").addClass(Person.class);


當然, 我在/root/也放置了hibernate.properties和hibernate.cfg.xml 2 files.
結果得到的exception是:
1
2
Exception in thread "main" net.sf.hibernate.HibernateException:
/root/hibernate.properties not found.


1
2
Exception in thread "main" net.sf.hibernate.HibernateException.
/root/hibernate.cfg.xml not found.


很奇怪的是:
我改用eclipse3.0.1也發生同樣問題.
不過, 至少eclipse可以使用 relative path save file !


reply to postreply to post
作者 Re:hibernate 快速入門 [Re:ray_linn]
struggle





發文: 19
積分: 0
於 2004-11-19 16:21 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
to:tomyoung 我也是hiberante新手,运行TestPerson和你遇到的错误差不多,后来我运行成功了,我是这样做的:

1)你将Person.hbm.xml 文件中的注释去掉,里面有非法字符
2)至于程序找不到Person.hbm.xml或者hibernate.properties文件,你试着换一下目录。

另外,请教一个问题,我运行TestCompany时,数据能够成功插入数据库中,但是出现如下异常:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
net.sf.hibernate.JDBCException: could not insert collection: [h.Company.employees#8]
  at net.sf.hibernate.collection.AbstractCollectionPersister.recreate(AbstractCollectionPersister.java:543)
  at net.sf.hibernate.impl.ScheduledCollectionRecreate.execute(ScheduledCollectionRecreate.java:23)
  at net.sf.hibernate.impl.SessionImpl.executeAll(SessionImpl.java:2407)
  at net.sf.hibernate.impl.SessionImpl.execute(SessionImpl.java:2364)
  at net.sf.hibernate.impl.SessionImpl.flush(SessionImpl.java:2229)
  at net.sf.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:61)
  at h.TestCompany.main(TestCompany.java:37)
Caused by: java.sql.SQLException: null,  message from server: "Unknown column 'posn' in 'field list'"
  at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:1876)
  at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1098)
  at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1192)
  at com.mysql.jdbc.Connection.execSQL(Connection.java:2051)
  at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1680)
  at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1527)
  at net.sf.hibernate.impl.NonBatchingBatcher.addToBatch(NonBatchingBatcher.java:22)
  at net.sf.hibernate.collection.AbstractCollectionPersister.recreate(AbstractCollectionPersister.java:524)
  ... 6 more
Exception in thread "main" 

我知道问题肯定出现在一下几句中,
1
2
3
4
5
6
<!--1:n關係的映射-->
   <list name="employees" cascade="all">
<key column="company_id"/>
<index column="posn"/> 
<one-to-many class="h.Person"/>
</list>

数据库中的确没有"posn"字段啊。那这个“posn”是哪来的呢?这个一对多应该怎么配置呢?
谢谢!


struggle edited on 2004-11-19 16:52
reply to postreply to post
作者 Re:hibernate 快速入門 [Re:ray_linn]
tomyoung





發文: 8
積分: 0
於 2004-11-19 21:45 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
我在 Windows 2000 server 上實作 JavaWorld Wiki [Hibernate入門] 的例子,確實可執行。
我的環境是:Windows 2000 server + JBuilder 9 + MySQL

但同樣這個例子拿到 Linux (Fedora Core 1) 上來,仍然發生Exception:
1
/hibernate.cfg.xml not found

為了怕 hibernate.cfg.xml file 放錯位置,
所有可能的 directory 我都放置 hibernate.cfg.xml,
結果卻令人失望。

不曉得其他可以執行 Hibernate program 的先進,都是在Windows平台上嗎?
如果,有可以在Linux平台執行的,能否告知您是用哪個版本嗎?
謝謝!


reply to postreply to post
» JWorld@TW »  Object Relational Mapping » Hibernate

reply to topicthreaded modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8