Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Как связать класс с таблицей в Hibernate
В Hibernate связь между классом и таблицей устанавливается через аннотации JPA. Это основа ORM.
Основные аннотации
@Entity и @Table
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "email", nullable = false, unique = true)
private String email;
@Column(name = "name", length = 100)
private String name;
}
@Entity помечает класс как persistent entity. Hibernate будет управлять его жизненным циклом.
@Table указывает имя таблицы. Если не указана, используется имя класса.
@Id и @GeneratedValue
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
Стратегии:
- IDENTITY: AUTO_INCREMENT (MySQL, SQL Server)
- SEQUENCE: для PostgreSQL, Oracle
- TABLE: универсальный способ
- UUID: для случайных ID
@Column
@Column(
name = "email",
nullable = false, // NOT NULL
unique = true, // UNIQUE
length = 255, // VARCHAR(255)
columnDefinition = "VARCHAR(255) DEFAULT 'user@example.com'"
)
private String email;
Отношения
@OneToMany и @ManyToOne
@Entity
public class Author {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToMany(mappedBy = "author", cascade = CascadeType.ALL)
private List<Book> books;
}
@Entity
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
@JoinColumn(name = "author_id")
private Author author;
}
@ManyToMany
@Entity
public class Student {
@ManyToMany
@JoinTable(
name = "student_course",
joinColumns = @JoinColumn(name = "student_id"),
inverseJoinColumns = @JoinColumn(name = "course_id")
)
private List<Course> courses;
}
Специальные аннотации
@Transient - поле не сохраняется в БД:
@Transient
private String temporaryData;
@Lob - для больших объектов:
@Lob
private String description; // CLOB
@Lob
private byte[] image; // BLOB
@Enumerated - для enum типов:
@Enumerated(EnumType.STRING)
private UserStatus status;
@Version - для оптимистической блокировки:
@Version
private Long version;
Полный пример
@Entity
@Table(name = "users", indexes = {
@Index(columnList = "email"),
@Index(columnList = "created_at")
})
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, unique = true, length = 255)
private String email;
@Column(nullable = false, length = 100)
private String username;
@Column(nullable = false)
private String password;
@Column
private Integer age;
@Column(name = "is_active", columnDefinition = "BOOLEAN DEFAULT TRUE")
private Boolean isActive;
@Column(nullable = false, updatable = false)
private LocalDateTime createdAt;
@Column
private LocalDateTime updatedAt;
@Transient
private String tempData;
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
private List<Post> posts;
@ManyToOne
@JoinColumn(name = "role_id")
private Role role;
public User() {}
public User(String email, String username, String password) {
this.email = email;
this.username = username;
this.password = password;
this.createdAt = LocalDateTime.now();
this.isActive = true;
}
// getters and setters
}
Типы данных Java -> SQL
| Java | SQL |
|---|---|
| String | VARCHAR |
| Integer | INT |
| Long | BIGINT |
| BigDecimal | DECIMAL |
| LocalDate | DATE |
| LocalDateTime | TIMESTAMP |
| Boolean | BOOLEAN |
| byte[] | BLOB |
Использование с Spring Data JPA
public interface UserRepository extends JpaRepository<User, Long> {
User findByEmail(String email);
}
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public User createUser(String email, String name) {
User user = new User(email, name);
return userRepository.save(user);
}
}
В этом примере Hibernate автоматически выполнит INSERT в таблицу users с соответствующими столбцами.