我正在使用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;
}
答案 0 :(得分:0)
使用此设计,您需要使用查询来获取该镇的市长:
select mayor from Town town
inner join town.mayor mayor
where town.name = :theTownOfResidenceOfTheClient
此查询必须作为DAO / Repository类方法的一部分执行。市长不能在Client对象的getMayor()
方法中使用。
答案 1 :(得分:0)
这是一个ERD问题,而不是ORM问题。
您可以在Person
和Town
之间建立关系,也可以不关联。如果有,则只能在引用属性中选择引用表中键中的值,或者为null(如果有效)。如果你没有这种关系,你没有任何限制。
当然,您不需要建立关系来尝试在查询/ JPQL中混合它们。如果没有关系,您的计划可能会为Town
城镇提供Person
作为可能值的列表,而不会强制他们选择一个。{1}}。或者你可能会做类似
SELECT t FROM Town t WHERE t.name = ?
然后经过那里的人镇。当然,也没有安全性,它不会为空。
另一种方法可能是有两列,一列作为Town的引用(允许为null),另一列作为自由文本。如果该表位于表中,则使用该引用,如果不使用该字符串。当然,这会使程序逻辑变得非常复杂。