Spring Data JPA дозволяє зручно працювати з ORM: для кожної таблиці досить просто створити entity-клас із відповідними полями. Поле певинного ключа позначається антацієї @Id. Але інколи доводиться працювати з таблицями, у яких є лише складений ключ. В такому випадку можна використати кілька підходів.
Вбудований клас
Нехай у нас є таблиця зі складеним клчем по полях product_id та language_id. Тоді нам потрібно створити допоміжний Embeddable-клас:
@Embeddable
public class ProductLanguageId implements Serializable {
@Column(name = "product_id")
private Long productId;
@Column(name = "language_id")
private Long languageId;
// constructors
public ProductLanguageId() {}
public ProductLanguageId(Long productId, Long languageId) {
this.productId = productId;
this.languageId = languageId;
}
// getters/setters
@Override
public boolean equals(Object o) { ... }
@Override
public int hashCode() { ... }
}
Створений клас потрібно використати в entity-класі для опису ключа:
@Entity
@Table(name = "product_language")
public class ProductLanguage {
@EmbeddedId
private ProductLanguageId id;
private String name;
//інші поля
}
Репозиторій в такому випадку має вигляд:
public interface ProductLanguageRepository
extends JpaRepository <ProductLanguage, ProductLanguageId> {
}
Використання:
ProductLanguageId id = new ProductLanguageId(1L, 2L);
productLanguageRepository.findById(id);
Анотація IdClass
Альтернативним способом є використання анотації @IdClass. В цьому випадку потрібно створити допоміжний клас%
public class ProductLanguageId implements Serializable {
private Long productId;
private Long languageId;
}
В entity-класі використовується відповідна анотація:
@Entity
@IdClass(ProductLanguageId.class)
@Table(name = "product_language")
public class ProductLanguage {
@Id
@Column(name = "product_id")
private Long productId;
@Id
@Column(name = "language_id")
private Long languageId;
private String name;
}
Невелику шпаргалку по запуску проєктів на Spring Boot можна знайти тут.
Коментарі
Дописати коментар