为了表达房间与门之间的包含关系,从而基于这种包含关系来得到拓扑
1.一个房间包含很多门,一个门属于两个房间----多对多关系
2.包含关系是唯一的----Set集合
3.关系由门维护(新增、删除)
环境:MyEclipse8.6 PostgreSQL9.2+postgis2.0 hibernate spatial
Door实体
import java.util.HashSet;
import java.util.Set;
import com.vividsolutions.jts.geom.MultiLineString;
public class Door {
private int id;
private MultiLineString geom;
private int lspaceid;
private int rspaceid;
private Set rooms=new HashSet();
set get略
}
Room实体
import java.util.HashSet;
import java.util.Set;
import com.vividsolutions.jts.geom.MultiPolygon;
public class Room {
private int roomid;
private MultiPolygon geom;
private Set doors=new HashSet();
get set略
}
映射
<?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">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="Room" table="room_dr" schema="public">
<id name="roomid" type="java.lang.Integer">
<column name="roomid" />
<generator class="assigned" />
</id>
<property name="geom" type="org.hibernatespatial.GeometryUserType">
<column name="geom" />
</property>
<set name="doors" inverse="true" table="door_room_join">
<key column="roomid"></key>
<many-to-many column="doorid" class="Door"></many-to-many>
</set>
</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">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="Door" table="door_rm" schema="public">
<id name="id" type="java.lang.Integer">
<column name="doorid" />
<generator class="assigned" />
</id>
<property name="lspaceid" type="java.lang.Integer">
<column name="lspaceid" />
</property>
<property name="rspaceid" type="java.lang.Integer">
<column name="rspaceid" />
</property>
<property name="geom" type="org.hibernatespatial.GeometryUserType">
<column name="geom" />
</property>
<set name="rooms" table="door_room_join" >
<key column="doorid" />
<many-to-many column="roomid" class="Room"/>
</set>
</class>
</hibernate-mapping>
测试
import java.util.Iterator;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.GeometryFactory;
import com.vividsolutions.jts.geom.LineString;
import com.vividsolutions.jts.geom.MultiLineString;
import com.vividsolutions.jts.geom.MultiPolygon;
import com.vividsolutions.jts.geom.Point;
import com.vividsolutions.jts.geom.Polygon;
import com.vividsolutions.jts.io.ParseException;
import com.vividsolutions.jts.io.WKTReader;
public class Test {
/**
* @param args
* 注意postgis.jar包导入
* 注意inverse="true"或inverse="false"的使用
* @throws ParseException
*/
public static void main(String[] args) throws ParseException {
// TODO Auto-generated method stub
// 找到Hibernate配置
Configuration config=new Configuration().configure();
//从配置中取出SessionFactory
SessionFactory factory=config.buildSessionFactory();
//从SessionFactory中取出一个Session
Session session=factory.openSession();
GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory( null );
Coordinate coord = new Coordinate( 1, 1 );
Point point = geometryFactory.createPoint( coord );
System.out.println(point);*/
WKTReader reader = new WKTReader();
MultiLineString line1 = (MultiLineString) reader.read("MULTILINESTRING((0 2, 1 1), (1 0, 1 1))");
MultiPolygon polygon1 = (MultiPolygon) reader.read("MULTIPOLYGON(((0 0, 0 3, 3 3, 3 0, 0 0), (1 1, 1 2, 2 1, 1 1)), ((9 9, 9 10, 10 9, 9 9)))");
Room r1=new Room();
r1.setRoomid(7);
r1.setGeom(polygon1);
Room r2=new Room();
r2.setRoomid(10);
r2.setGeom(polygon1);
Door d1=new Door();
d1.setId(8);
d1.setLspaceid(0);
d1.setRspaceid(0);
d1.setGeom(line1);
Door d2=new Door();
d2.setId(9);
d2.setLspaceid(0);
d2.setRspaceid(0);
d2.setGeom(line1);
/* <set name="doors" inverse="true" table="door_room_join">说明
* 关系来door表来维护*/
d1.getRooms().add(r1);
d1.getRooms().add(r2);
d2.getRooms().add(r1);
d2.getRooms().add(r2);
/* r1.getDoors().add(d1);
r1.getDoors().add(d2);
r2.getDoors().add(d1);*/
Transaction tx=session.beginTransaction();
session.save(r1);
session.save(r2);
session.save(d1);
session.save(d2);
tx.commit();
Query query=session.createQuery("from Door as d1 where d1.id=:pid");
//设置参数
for(int i=8;i<10;i++)
{query.setInteger("pid", i);
List<Door> result= query.list();
for(Door p:result){
System.out.println(p.getId());
Iterator<Room> rooms= p.getRooms().iterator();
while(rooms.hasNext()){//遍历
System.out.println(rooms.next().getRoomid());
}
}
}
session.close();
}
}
输出
8
10
7
[main] DEBUG org.hibernate.jdbc.AbstractBatcher - about to open PreparedStatement (open PreparedStatements: 0, globally: 0)
[main] DEBUG org.hibernate.jdbc.ConnectionManager - opening JDBC connection
[main] DEBUG org.hibernate.SQL - select door0_.doorid as doorid0_, door0_.lspaceid as lspaceid0_, door0_.rspaceid as rspaceid0_, door0_.geom as geom0_ from public.door_rm door0_ where door0_.doorid=?
Hibernate: select door0_.doorid as doorid0_, door0_.lspaceid as lspaceid0_, door0_.rspaceid as rspaceid0_, door0_.geom as geom0_ from public.door_rm door0_ where door0_.doorid=?
[main] DEBUG org.hibernate.jdbc.AbstractBatcher - about to open ResultSet (open ResultSets: 0, globally: 0)
[main] DEBUG org.hibernate.loader.Loader - result row: EntityKey[Door#9]
[main] DEBUG org.hibernate.jdbc.AbstractBatcher - about to close ResultSet (open ResultSets: 1, globally: 1)
[main] DEBUG org.hibernate.jdbc.AbstractBatcher - about to close PreparedStatement (open PreparedStatements: 1, globally: 1)
[main] DEBUG org.hibernate.engine.StatefulPersistenceContext - initializing non-lazy collections
[main] DEBUG org.hibernate.jdbc.ConnectionManager - aggressively releasing JDBC connection
[main] DEBUG org.hibernate.jdbc.ConnectionManager - releasing JDBC connection [ (open PreparedStatements: 0, globally: 0) (open ResultSets: 0, globally: 0)]
9
10
7