При реализации составных первичных ключей в Hibernate или других ORM существует до трех мест, где можно вставить вставляемые = false, Updatable = false в составных созвездиях первичного ключа, которые используют идентифицирующие отношения (FK, являющиеся частью PK):
- В составную аннотацию класса PK '@Column (только для классов @Embeddable) или
- В ассоциацию класса сущностей' @ аннотация JoinColumn / s или
- Вкласс сущности ' избыточный аннотация @Column свойства PK (только для классов @IdClass)
Третий единственный способ сделать с @IdClass и JPA 1.0 AFAIK.См. http://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#Primary_Keys_through_OneToOne_Relationships.. Я рассмотрю только случаи 1. и 2.
В: Каким способом предпочтительнее в общем случае указать «вставляемый = ложный, обновляемый = ложный»?
У меня возникли проблемы с 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;
...
}
Класс составного ПК:
@Embeddable
public class ZipId implements Serializable
{
@Column(name = "country_code", insertable = false, updatable = false)
private String countryCode;
@Column(name = "code")
private String code;
...
}
При помещении вставляемого = false, Updatable = false в класс сущности@JoinColumn ассоциации все исключения исчезают, и все работает нормально.Однако я не понимаю, почему приведенный выше код не должен работать.Возможно, у Hibernate возникли проблемы с этим.Является ли описанная ошибка Hibernate, поскольку она, похоже, не оценивает @Column "вставляемый = ложный, обновляемый = ложный"?
По сути, каков стандартный способ JPA, лучший метод или предпочтение, кудапоставить "вставляемый = ложь, обновляемый = ложь"?