2013-05-27 4 views
3

У меня проблема с отображением спящего режима. У меня есть следующие две таблицы БД (не допускается изменение БД):Hibernate @EmbeddedId + join

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

    // ... 
} 

Трудность состоит в том, что я хочу, чтобы установить соединение OneToMany между колонной и часть столбца embeddedId. Любые идеи по этой проблеме? (Я использую спящий режим 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