使用备用目标列进行hibernate映射

时间:2012-09-05 08:04:17

标签: java hibernate jpa

我有一个模型对象关系,例如:

@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
}

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

2 个答案:

答案 0 :(得分:2)

我认为不可能在Port中定义从Port到Cable的关系,只有一个关联。

在我看来,您最好的选择是使用'mappedBy'连接方法定义2个可选的一对一关联到Port in Port(dstPortCablesrcPortCable),然后在Port中定义一个方法:

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

答案 1 :(得分: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;