Hibernate: где находятся insertable = false, updatable = false совокупности составных первичных ключей, включающие внешние ключи?

При реализации составных первичных ключей в Hibernate или других ORM есть до трех мест, куда помещать insertable = false, updatable = false в созвездиях составных первичных ключей, которые используют идентификация отношений (FK, которые являются частью PK):

  1. В аннотацию @Column составного PK-класса (только классы @Embeddable) или
  2. В ассоциацию @Column / s аннотации класса сущности или
  3. Into аннотация @Column свойства PK (только классы @IdClass)

Третий - единственный способ сделать с @IdClass и JPA 1.0 AFAIK. См. http://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#Primary_Keys_through_OneToOne_Relationships . Рассмотрю только случаи 1. Какой путь является предпочтительным местом для вставки «insertable = false, updatable = false» в целом?

У меня возникли проблемы с Hibernate по этому вопросу. Например, Hibernate 3.5.x будет жаловаться на таблицу Zips

CREATE TABLE Zips
(
  country_code CHAR(2),
  code VARCHAR(10),
  PRIMARY KEY (country_code, code),
  FOREIGN KEY (country_code) REFERENCES Countries (iso_code)
)

с помощью:

org.hibernate.MappingException: Repeated column in mapping for entity: com.kawoolutions.bbstats.model.Zip column: country_code (should be mapped with insert="false" update="false")
org.hibernate.mapping.PersistentClass.checkColumnDuplication(PersistentClass.java:676)
org.hibernate.mapping.PersistentClass.checkPropertyColumnDuplication(PersistentClass.java:698)
...

Как вы можете видеть, столбец country_code имеет значение PK и FK. Вот его классы:

Класс сущности:

@Entity
@Table(name = "Zips")
public class Zip implements Serializable
{
    @EmbeddedId
    private ZipId id;

    @ManyToOne
    @JoinColumn(name = "country_code", referencedColumnName = "iso_code")
    private Country country = null;
...
}

Составной класс PK:

@Embeddable
public class ZipId implements Serializable
{
    @Column(name = "country_code", insertable = false, updatable = false)
    private String countryCode;

    @Column(name = "code")
    private String code;
...
}

При помещении insertable = false, updatable = false в @JoinColumn ассоциации класса сущности все исключения исчезают, и все работает нормально. Однако я не понимаю, почему приведенный выше код не должен работать. Возможно, у Hibernate проблемы с этим. Является ли описанная ошибка Hibernate, поскольку она, похоже, не оценивает @Column "insertable = false, updatable = false"?

По сути, каков стандартный способ JPA, наилучшая практика или предпочтение, куда поместить "insertable = false, updatable = false"?

32
задан ManuPK 25 February 2012 в 08:19
поделиться