使用外部id暂停一对一映射

时间:2011-04-11 11:42:15

标签: java sql hibernate

鉴于我们已经

  

表Person(id,address_id)和Address   (id,town)

和POJO

  

class Person {

 int id;
 int addressId;  
     

}

     

班级地址{
          int id;
      弦镇;

     

}

是否可以将地址映射到某人? (休眠)

*查询一个人只会得到它的id和它的地址id

是否也可以通过他/她的城镇搜索一个人?

更新 我想补充一点:Person类仅限于int addressId;使用 一个原因是我们希望Person类是原子的(所有数据都是独立的)并将其用于Web服务等

提前致谢

2 个答案:

答案 0 :(得分:4)

将字段private int addressId;替换为人员中的private Address address;字段,并在字段中添加@OneToOne注释。

@Entity
class Person {
  @Id
  int id;

  @OneToOne
  Address address;
}

@Entity
class Address{
   @Id
   int id;

   String town;
}

如果Address不是自己的表,那么在@Embeddable Annotation上有一个战利品。 (Hibernate Annotation Reference的Chapter 2.2.2.2. Access type中的示例)


更新

  

我想补充一点:Person类仅限于使用int addressId;

您需要更复杂的HQL查询:请参阅Hibernate Reference Documentation

SELECT p FROM Person as p
WHERE p.addressId in (
    SELECT a.id FROM Address AS a WHERE a.town = 'Dresden'
)

答案 1 :(得分:0)

首先... int在这里不是一个非常好的选择,因为id可以为null(只要它们不被持久化并获得它们的值@GeneratedValue并且存储addressId很麻烦......

怎么样?
class Person {
    Integer id;
    Address address;
}

然后你可以查询“SELECT p.id,p.address.id FROM Person p”和“SELECT p FROM Person p WHERE p.address.town =:town”......