hibernate中的一个要注意的连接关联问题

情景为,投票程序.游客可以对一个作品进行投票的,它们之间有点象多对多的关系,投票时,每个单独的IP每天
只能投某个作品一次,要投第2次的话只能等第2天了.数据库结构表为:
ip表
id   自动递增
ip   ip
votetime  投票时间
pid          该投票是投哪一个作品,关联photo表的pid字段

那么分别看vote类的domain设计
  

public class Vote {

 private int id;
   private int voteid;
   private String ip;
   private String votetime;
   private Photo photo;

////省略getter/setter;


public class photo
{
 private Set ip;
//其他省略.

vote.hbm.xml:
  

<hibernate-mapping>
 <class table="ip" name="liao.domain.Vote">
 <id name="id" column="id" type="integer">
   <generator class="increment" />
  </id>
 

  <property name="ip"/>
 
  <property name="votetime"/>
   <many-to-one column="pid" name="Photo" not-null="true" class="liao.domain.Photo"/>
   
 </class>
</hibernate-mapping>

photo.hbm.xml
 其中关联的部分为
<set cascade="none" name="ip" inverse="true" lazy="false">
   <key column="pid" />
   <one-to-many class="liao.domain.Vote" />
  </set>

好了,上面四者都有的话,下面有个场景,很实际,是查询的,要查询某个PID的作品是否已经有IP投过票了,应该这样搞.
Object[] params=new Object[]{pid};
  

 List dataList = this.getHibernateTemplate().find("from Vote as i where i.Photo.pid=?",pid);
// List dataList=this.getHibernateTemplate().find("select ip from Vote ip where ip.pid=?",pid);
         if (dataList.size() == 0) {
    return null;
         }
         else
         {
       
           System.out.println(dataList.get(0).toString());
         return (Vote)dataList.get(0);
  

   要特别注意 List dataList = this.getHibernateTemplate().find("from Vote as i where i.Photo.pid=?",pid);
的写法,这样比较好.

你可能感兴趣的:(hibernate中的一个要注意的连接关联问题)