3

休止状態のマッピングに問題があります。次の 2 つの DB テーブルがあります (DB を変更することはできません)。

LOCATIONS {
   ID, -- PK
   NAME
}

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

これらの DB テーブルのエンティティを作成しようとしましたが、テーブル間の接続をマップする方法がわかりません。これが私の試みです(しかし、それは間違っています):

埋め込み可能なクラス

    @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;
        }
        
        // ...
    }   

使用される EmbeddedId

    @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 列の一部との間に OneToMany 接続を確立したいことです。この問題のアイデアはありますか? (休止状態 4.0.1 を使用しています)

4

1 に答える 1

10

@JoinColumn場所は、ではなくでマッピングする必要があります@Column

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

ただし、これは標準の JPA ではないことに注意してください。標準にするには、次を使用します

埋め込み可能なクラス

@Embeddable
public class LocationGroupId implements Serializable {

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

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

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

使用される EmbeddedId

@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;
    }
    // ...
}

これら 2 つのマッピングについては、ドキュメントで説明されています。

于 2013-05-27T14:55:31.347 に答える