Как отобразить составной ключ сущности в JPA? - PullRequest
5 голосов
/ 16 апреля 2009

У меня есть таблица REGION:

REG {
    id number,
    dateCreation Date
  }

У меня есть стол LOCALE:

LOCALE {
     locale String
  }

У меня есть таблица REGION_DESCRIPTION:

REGION_DESCRIPTION {
     locale String,
     regId number,
     description
  } 

REGION_DESCRIPTION имеет составной ключ: locale - это внешний ключ, указывающий на таблицу LOCALE. И regId указывает на таблицу REGION.

Я хотел бы сопоставить это с моим Java-классом Region:

private List<RegionDescription> descriptions;

Я пробовал другой подход в JPA. Но я не могу заставить отображение работать. Какие-либо предложения?

Ответы [ 3 ]

2 голосов
/ 17 апреля 2009

У вас есть случай, когда объединяющая таблица (REGION_DESCRIPTION) становится сущностью, имеющей свои собственные атрибуты. Я бы предложил следующее:

  1. определить RegionDescription как полная сущность с композитом класс первичного ключа, см. пример ;

  2. определяет 2 отношения многие-к-одному в RegionDescription : RegionDescription до Region и RegionDescription до Locale .

  3. альтернативно или дополнительно определить отношения один-ко-многим в регионе на карту RegionDescription это путь Вы указали выше.

1 голос
/ 07 июня 2012

Это должно удовлетворить ваши потребности:

@Entity
public class Region
{
    @Id
    private Long id;
    @Temporal(TemporalType.DATE)
    private Date dateCreation;
    @OneToMany(mappedBy = "region")
    @JoinColumn(name = "id", referencedColumnName = "region_id")
    private List<RegionDescription> descriptions;
}

@Entity
public class Locale
{
    @Id
    private String name;
}

@Entity
public class RegionDescription
{
    @EmbeddedId
    private RegionDescriptionPK key;

    @MapsId(value = "regionId")
    @ManyToOne
    @JoinColumns({
        @JoinColumn(name = "region_id", referencedColumnName = "id")
    })
    private Region region;

    @MapsId(value = "localeName")
    @ManyToOne
    @JoinColumns({
        @JoinColumn(name = "locale", referencedColumnName = "name")
    })
    private Locale locale;
}

@Embeddable
public class RegionDescriptionPK
{
    @Column(name = "id")
    private Long regionId;

    @Column(name = "locale")
    private String localeName;
}

Как примечание, я видел, что этот вопрос довольно старый. Но это не закрыто как-то. : -)

0 голосов
/ 18 ноября 2015

Это должно работать:

@Entity
public class Region
{
    @Id
    private Long id;
    @Temporal(TemporalType.DATE)
    private Date dateCreation;

    @OneToMany(mappedBy = "regionDescriptionPK.region")
    private List<RegionDescription> descriptions;
}


@Entity
public class RegionDescription
{
    @EmbeddedId
    private RegionDescriptionPK regionDescriptionPK;    
}

@Embeddable
public class RegionDescriptionPK
{
    @ManyToOne
    @JoinColumn(name = "Region_ID")
    private Region region;

    @ManyToOne
    @JoinColumn(name = "locale")
    private Locale locale;
}

@Entity
public class Locale
{
    @Id
    private String name;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...