Как создать и обработать составной первичный ключ в JPA
Я хочу иметь версии из одного и того же ввода данных. Другими словами, я хочу дублировать запись с другим номером версии.
id - Version
будет основным ключом.
Как должен выглядеть объект? Как я могу дублировать его с другой версией?
- Предполагается, что в JPA есть один repository за столом?
- Уровни DAO и Service (JPA / Hibernate + Spring)
- java.lang.NoSuchMethodError: javax.persistence.spi.PersistenceUnitInfo.getValidationMode () Ljavax / persistence / ValidationMode;
- JPA / JTA / @Transactional Spring аннотация
- org.hibernate.HibernateException: доступ к DialectResolutionInfo не может быть нулевым, если «hibernate.dialect» не установлен
id Version ColumnA 1 0 Some data 1 1 Some Other data 2 0 Data 2. Entry 2 1 Data
- JPA 2.0 orphanRemoval = true VS on delete Cascade
- Недействительность сессии JPA EntityManager
- Java - JPA - Генераторы - @SequenceGenerator
- HQL присоединился к запросу, чтобы получить большое количество связей
- Как создать таблицу объединений с аннотациями JPA?
- Связь JPA Hibernate «один-к-одному»
- Метод @Transactional, вызванный из другого метода, не получает транзакции
- Hibernate: где insertable = false, updatable = false принадлежит составным созвездиям первичных ключей с участием внешних ключей?
Вы можете создать Embedded class
, содержащий два ваших ключа, а затем ссылку на этот class как EmbeddedId
в свой Entity
.
Вам @Embeddable
annotations @EmbeddedId
и @Embeddable
.
@Entity public class YourEntity { @EmbeddedId private MyKey myKey; @Column(name = "ColumnA") private String columnA; /** Your getters and setters **/ }
@Embeddable public class MyKey implements Serializable { @Column(name = "Id", nullable = false) private int id; @Column(name = "Version", nullable = false) private int version; /** getters and setters **/ }
Другой способ достичь этой задачи – использовать аннотацию @IdClass
и поместить оба id
в этот IdClass
. Теперь вы можете использовать стандартную аннотацию @Id
для обоих атрибутов
@Entity @IdClass(MyKey.class) public class YourEntity { @Id private int id; @Id private int version; }
public class MyKey implements Serializable { private int id; private int version; }
Класс MyKey должен реализовывать Serializable
если вы используете @IdClass
Ключевой class:
@Embeddable @Access (AccessType.FIELD) public class EntryKey implements Serializable { public EntryKey() { } public EntryKey(final Long id, final Long version) { this.id = id; this.version = version; } public Long getId() { return this.id; } public void setId(Long id) { this.id = id; } public Long getVersion() { return this.version; } public void setVersion(Long version) { this.version = version; } public boolean equals(Object other) { if (this == other) return true; if (!(other instanceof EntryKey)) return false; EntryKey castOther = (EntryKey) other; return id.equals(castOther.id) && version.equals(castOther.version); } public int hashCode() { final int prime = 31; int hash = 17; hash = hash * prime + this.id.hashCode(); hash = hash * prime + this.version.hashCode(); return hash; } @Column (name = "ID") private Long id; @Column (name = "VERSION") private Long operatorId; }
Класс сущности:
@Entity @Table (name = "YOUR_TABLE_NAME") public class Entry implements Serializable { @EmbeddedId public EntryKey getKey() { return this.key; } public void setKey(EntryKey id) { this.id = id; } ... private EntryKey key; ... }
Как я могу дублировать его с другой версией?
Вы можете отделить объект, который извлекается у поставщика, изменить ключ Entry и затем сохранить его как новый объект.
Класс MyKey (@Embeddable) не должен иметь никаких отношений, таких как @ManyToOne
При использовании annotations @IdClass
еще один отзыв, который я нашел, – это аннотация @Column
должна входить в поля classа Entity ( YourEntity
в образце кода RohitJan).