← Назад к вопросам

Как связать класс с таблицей в Hibernate

2.0 Middle🔥 161 комментариев
#Основы Java

Комментарии (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

JavaSQL
StringVARCHAR
IntegerINT
LongBIGINT
BigDecimalDECIMAL
LocalDateDATE
LocalDateTimeTIMESTAMP
BooleanBOOLEAN
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 с соответствующими столбцами.

Как связать класс с таблицей в Hibernate | PrepBro