2013-05-27 75 views
3

我有一个休眠映射问题。我有以下两个数据库表(我不擅自改变DB):休眠@EmbeddedId +加入

LOCATIONS { 
    ID, -- PK 
    NAME 
} 

LOCATION_GROUPS { 
    LOC_ID, -- PK, and FK to LOCATIONS.ID 
    GROUP_NAME -- PK 
} 

我试图创建这些数据库表的实体,但我不知道如何映射表之间的连接。这是我尝试(但它是错的):

@Embeddable 
public class LocationGroupId implements Serializable { 

    private static final long serialVersionUID = -6437671620548733621L; 
    private Location loc; 
    private String group; 

    @Column(name = "LOC_ID") 
    public Location getLoc() { 
     return loc; 
    } 

    @Column(name = "GROUP_NAME") 
    public String getGroup() { 
     return group; 
    } 

    // ... 
} 

@Entity 
@Table(name = "LOCATION_GROUPS") 
public class LocationGroup { 

    private LocationGroupId id; 

    @EmbeddedId 
    public LocationGroupId getId() { 
     return id; 
    } 

    // ... 
} 


@Entity 
@Table(name = "LOCATIONS") 
public class Location { 

    private Long id; 
    private String name; 
    private List<LocationGroup> groups; 

    @Column(name = "NAME") 
    public String getName() { 
     return this.name; 
    } 

    @OneToMany(mappedBy = "id.loc") 
    public List<LocationGroup> getGroups() { 
     return this.groups; 
    } 

    @Id 
    @Column(name = "ID") 
    @SequenceGenerator(name = "LocationIdGen", sequenceName = "LOCATION_SQ") 
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "LocationIdGen") 
    public Long getId() { 
     return this.id; 
    } 

    // ... 
} 

的困难是,我想要一列和embeddedId列的一部分之间的一对多连接。 对这个问题有什么想法? (我使用Hibernate 4.0.1)

回答

4

的位置必须与@JoinColumn映射,而不是与@Column

@JoinColumn(name = "LOC_ID") 
public Location getLoc() { 
    return loc; 
} 

请注意,这不是标准的JPA虽然。为了使标准,你可以使用

@Embeddable 
public class LocationGroupId implements Serializable { 

    private static final long serialVersionUID = -6437671620548733621L; 
    private Long locationId; 
    private String group; 

    @Column(name = "LOC_ID") 
    public Long getLocationId() { 
     return loc; 
    } 

    @Column(name = "GROUP_NAME") 
    public String getGroup() { 
     return group; 
    } 

    // ... 
} 

@Entity 
@Table(name = "LOCATION_GROUPS") 
public class LocationGroup { 

    private LocationGroupId id; 
    private Location location; 

    @EmbeddedId 
    public LocationGroupId getId() { 
     return id; 
    } 

    @ManyToOne 
    @JoinColumn(name = "LOC_ID") 
    @MapsId("locationId") 
    private Location getLocation() { 
     return location; 
    } 

    // ... 
} 

这两个映射在the documentation解释。

+0

JB Nizet,谢谢你的回答。在我阅读你的答案之前,我发现该页面: http://beavercreekconsulting.com/blog/2008/10/hibernate-annotations-for-a-one-to-many-mapping/ 并使用它。但我很欣赏你的答案,并接受它作为解决方案:) – Imreking