2012-09-05 41 views
0

Hibernate映射我有一个模型对象关系如此:交替目标列

@Table(name="cables") 
class Cable { 
    @Id 
    private Long id; 
    @Column(name="dstport_id") 
    private Port dstPort; 
    @Column(name="srcport_id") 
    private Port srcPort; 
} 
@Table(name="ports") 
class Port { 
    @Id 
    private Long id; 
    private Cable cable; // Here's the mapping that should point to cables.dstport_id or cables.srcport_id whatever is present 
} 

在这种关系中,映射是通过电缆的dstport_id OR srcport_id列的一对1映射。电缆可以连接到没有,一个或两个(完全不同的)端口。一个端口可以连接到没有或仅连接一根电缆,也可以连接到任一端点。那么,Hibernate有没有办法在Port实体内映射这种关系(在Cable实体内部没有任何技巧可以映射它)?

+0

请张贴您的架构以及。 – hsanders

回答

2

我不相信这是可能的定义从港关系Port只有一个协会。

在我看来,最好的办法是确定2个可选,一个对一个协会,以电缆在港口使用“的mappedBy”连接方法(dstPortCablesrcPortCable,说的),然后定义端口的方法,因此:

public Cable getCable() { 
    if (dstPortCable != null) { 
     return dstPortCable; 
    } 
    if (srcPortCable != null) { 
     return srcPortCable; 
    } 
    return null; 
} 
+0

这是我在缺乏(我所知)简化符号方面实施的唯一方法。谢谢。 – GateKeeper

0

所以据我了解,你需要One to Many mapping (Cable to Port) in Cable.javaOne to One mapping in Port.java类。

所以在Calble.java你可以做如下 -

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY) 
@JoinColumn(name = "srcport_id",nullable=false) 
@ForeignKey(name = "fk_srcport_id")  
private List<Port > ports= new ArrayList<Port >(); 

和Port.java -

@OneToOne(fetch=FetchType.LAZY) 
@JoinColumn(name = "srcport_id", updatable = false, insertable = false, nullable=false) 
private Calble Calble;  
+0

不,我需要2个不同的一对一映射,从电缆到端口(每个电缆的两个端点独立连接或不连接到其端口)以及端口到电缆的单个一对一映射,但需要具有可变目标列以解决映射的实体对象(一个端口可以连接到SRC端点或电缆的DST端点)。 – GateKeeper