案例: 
主表:用户User 
属性: 
private int uid; 
private String name; 
private String pid; 
private Set <Room> rooms=new HashSet <Room>(); 
table user(UID,NAME,PID,URID) 子表:住房Room 
属性: 
private int rid; 
private String address; 
private double price; 
table room(RID ADDRESS PRICE) 主表与子表之间是单向关联关系 
问题: 
在主表user中使用URID来表达用户与住房的一对多关系 
而在子表room中只有住房应有属性对应的字段 
SQL建表语句和对应的*.hbm.xml内容怎么写呢
我想把这个做成单向关联 
而且我想避免在Room中使用外键会造成同一个住房多条记录的状况 
比如住房1去年被用户1购买,Room表中就会添加一条记录 
今年用户1将住房1售出,用户2又购买了住房1, 
Room表中又会添加一条住房1的记录 
不同的是它是被用户2购买的 
我想把Room表设计成住房统计表而不是既统计住房数量又统计销售情况表 
而User表只统计房屋购买者的购买情况 
也就是说只要买过就能在数据库中体现

解决方案 »

  1.   

    按照你讲的, user和room之间不是1:n关系, 而是m:n关系. 用hibernate固然可以直接映射m:n关系, 但是我用下来不爽. 引入deal表述成交关系会好做很多:
    user(userId, name, ...)
    room(roomId, address, ...)
    deal(userId, roomId, price, date, ...)
    这应该能解决你的问题了吧.
      

  2.   

    用annotation,注解。就不用XML配置了
      

  3.   

    这个业务比较简单,是个典型的多对多的关系,首先你的模型上设计就有些问题,这样设计并不能统计出,如果一个用户先买后买都是同一套房屋,这种情况就没法记录,我建议在room模型下面加上一个标示,并且做双向关联比较方便。
    private int rid; 
    private String address; 
    private double price; 
    boolean isBuy;
    User user;
    table room(RID ADDRESS PRICE) 
    这样就可以标示出这个用户对同一套房屋到底是买还是卖。对应的XML文件可以用工具生成也可以手写.