是否可以链接唯一列上的对象?

时间:2012-09-04 09:12:40

标签: java hibernate orm

我正在使用Hibernate 3.2.7.ga,我想知道以下是否可行。

假设有三个对象:人,镇和市长。

在申请中注册人员时,您被要求进入他或她的居住城镇。该字段保存为字符串。

在申请的另一部分,您可以注册一个城镇(包括其名称,居民人数等)。在城镇注册后,你可以在这个城镇增加一位市长。

但是,不希望为使用客户端输入的每个城镇创建Town对象。只有在需要注册市长时才需要对象。

我想知道,如果只是bij使用Person中的String字段,你可以获得该人所居住的城镇市长。

我正在考虑这些代码:

public class Client.java
{
  @Id
  public Long id;

  @Column(nullable = true, ??? )
  public String townOfResidence;

  public Mayor getMayor()
  {
    ...
  }
}

public class Town.java
{
  @Id
  public Long id;

  @Column(nullable = false, unique = true)
  public String name;

  @OneToOne
  public Mayor mayor;
}

public class Client.java { @Id public Long id; @Column(nullable = true, ??? ) public String townOfResidence; public Mayor getMayor() { ... } } public class Town.java { @Id public Long id; @Column(nullable = false, unique = true) public String name; @OneToOne public Mayor mayor; }

我只是按照以下几点思考:

@Transient
private Town townObject;

@ManyToOne(fetch = FetchType.LAZY, cascade = javax.persistence.CascadeType.ALL, targetEntity = Town.class, optional = true)
@JoinColumn(referencedColumnName = "town")
public Town getTown()
{
    return townObject;
}

2 个答案:

答案 0 :(得分:0)

使用此设计,您需要使用查询来获取该镇的市长:

select mayor from Town town
inner join town.mayor mayor
where town.name = :theTownOfResidenceOfTheClient

此查询必须作为DAO / Repository类方法的一部分执行。市长不能在Client对象的getMayor()方法中使用。

答案 1 :(得分:0)

这是一个ERD问题,而不是ORM问题。

您可以在PersonTown之间建立关系,也可以不关联。如果有,则只能在引用属性中选择引用表中键中的值,或者为null(如果有效)。如果你没有这种关系,你没有任何限制。

当然,您不需要建立关系来尝试在查询/ JPQL中混合它们。如果没有关系,您的计划可能会为Town城镇提供Person作为可能值的列表,而不会强制他们选择一个。{1}}。或者你可能会做类似

的事情
 SELECT t FROM Town t WHERE t.name = ?

然后经过那里的人镇。当然,也没有安全性,它不会为空。

另一种方法可能是有两列,一列作为Town的引用(允许为null),另一列作为自由文本。如果该表位于表中,则使用该引用,如果不使用该字符串。当然,这会使程序逻辑变得非常复杂。