Hibernate는 Java 프로그램의 객체를 데이터베이스의 관계형 데이터에 매핑하는 데 사용되는 오픈 소스 ORM(Object Relational Mapping) 프레임워크입니다. Hibernate에서 지속성 클래스는 Java 객체와 관계형 데이터베이스 테이블을 매핑하는 데 사용되는 클래스입니다.
Hibernate 지속성 클래스를 작성할 때 다음 규칙을 따라야 합니다:
지속성 클래스는 인수 없는 생성자를 가져야 합니다. 그렇지 않으면 Hibernate는 객체를 생성할 수 없습니다.
지속성 클래스는 데이터베이스의 테이블에 매핑되어야 합니다. @Table 주석을 사용하여 테이블 이름을 지정할 수 있습니다.
지속성 클래스의 속성은 데이터베이스 테이블의 열과 일대일로 일치해야 합니다. @Column 주석을 사용하여 열 이름을 지정할 수 있습니다.
영속 클래스에는 @Id 주석을 사용하여 지정할 수 있는 고유 식별자가 있어야 합니다.
영속 클래스의 속성은 @Basic 주석을 사용하여 문자열, 숫자 등과 같은 기본 유형인지 여부를 지정할 수 있습니다.
영속 클래스의 속성은 @Transient 주석을 사용하여 지정할 수 있으며 데이터베이스에 유지될 필요가 없습니다.
Hibernate에는 많은 기본 키 생성 전략이 있으며, 일반적인 전략으로는 자동 증가, UUID, 시퀀스 등이 있습니다. @GeneratedValue 주석을 사용하여 기본 키 생성 전략을 지정할 수 있습니다. 예:
@Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id;
@GeneratedValue 주석의 strategy 속성은 기본 키 생성 전략의 방법을 지정하고 IDENTITY는 자동 증가 방법을 사용하여 기본 키.
주석을 사용하여 기본 키 생성 전략을 지정하는 것 외에도 XML 파일을 사용하여 기본 키 생성 전략을 구성할 수도 있습니다. 예:
<id name="id" type="java.lang.Long"> <column name="id" /> <generator class="identity" /> </id>
태그의 클래스 속성은 기본 키 생성 전략의 방법을 지정합니다. ID는 자동 증가 방법을 사용하여 기본 키를 생성하는 것을 의미합니다.
Hibernate에서 지속성 클래스에는 일시적 상태, 지속성 상태, 자유 상태의 세 가지 상태가 있습니다.
임시 상태: 영구 클래스 개체는 세션과 연결되지 않았으며 데이터베이스에 저장되지 않았습니다. 이때 수정된 개체의 속성은 데이터베이스에 저장되지 않습니다.
영구 상태: 영구 개체가 데이터베이스에 저장되고 세션과 연결됩니다. 이때 수정된 개체의 속성이 데이터베이스에 저장됩니다.
Free 상태: 영속 객체가 데이터베이스에 저장되었지만 더 이상 Session과 관련이 없습니다. 이때 수정된 객체의 속성은 데이터베이스에 저장되지 않습니다.
세션의 저장, 지속, 업데이트 및 병합 메서드를 사용하여 영구 클래스 객체를 임시 상태에서 영구 상태 또는 자유 상태로 변환할 수 있습니다.
save 메소드는 임시 상태 개체를 데이터베이스에 저장하고 영구 상태 개체를 반환하는 데 사용됩니다. 객체가 이미 지속성인 경우 아무 작업도 수행되지 않습니다.
지속 메서드는 임시 상태 개체를 데이터베이스에 저장하는 데 사용되며 지속 상태 개체를 반환하지 않습니다. 객체가 이미 지속성인 경우 아무 작업도 수행되지 않습니다.
업데이트 메서드는 자유 상태 개체를 데이터베이스에 업데이트하고 영구 상태 개체를 반환하는 데 사용됩니다. 객체가 일시적인 경우 예외가 발생합니다.
병합 메소드는 자유 상태 개체를 세션에 병합하고 영구 상태 개체를 반환하는 데 사용됩니다. 객체가 일시적인 경우 객체를 데이터베이스에 저장하고 객체를 지속 상태로 반환합니다.
Hibernate의 첫 번째 수준 캐시는 영구 클래스 개체를 캐시하는 데 사용되는 세션 수준 캐시입니다. 데이터베이스에서 영속 클래스 객체를 쿼리할 때 Hibernate는 먼저 첫 번째 수준 캐시에서 이를 검색합니다. 캐시에 존재하지 않으면 데이터베이스에서 쿼리하고 쿼리 결과를 첫 번째 수준 캐시에 넣습니다.
첫 번째 수준 캐시의 수명 주기는 세션의 수명 주기와 동일합니다. 세션이 닫히면 첫 번째 수준 캐시도 지워집니다. 세션의 evict 및clear 메소드를 사용하여 첫 번째 수준 캐시를 지울 수 있습니다.
evict 메소드는 첫 번째 수준 캐시에서 지정된 개체를 제거하여 개체를 자유롭게 만드는 데 사용됩니다.
clear 메소드는 1단계 캐시의 모든 객체를 지우고 모든 영속 객체를 자유 상태로 변경하는 데 사용됩니다.
Hibernate에서 트랜잭션은 데이터베이스 작업의 원자성, 일관성, 격리 및 내구성을 보장하는 데 사용됩니다. 트랜잭션 인터페이스를 사용하여 트랜잭션을 관리할 수 있습니다. 예:
Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); try { // 执行数据库操作 tx.commit(); } catch (Exception e) { tx.rollback(); } finally { session.close(); }
트랜잭션에서 세션의 저장, 지속, 업데이트, 병합, 삭제 및 기타 메소드를 사용하여 영구 클래스 객체를 작동하고 작업 결과를 데이터베이스에 저장할 수 있습니다. 거래가 중간에 제출될 때.
위에 소개된 API 외에도 Hibernate는 다음과 같은 많은 다른 API도 제공합니다.
Criteria API: 영속 클래스 객체를 동적으로 쿼리하는 데 사용됩니다.
HQL(Hibernate Query Language): 영구 클래스 객체를 쿼리하는 데 사용되는 SQL 기반 쿼리 언어입니다.
명명된 쿼리: 쉽게 재사용할 수 있도록 HQL 쿼리 문을 지속성 클래스에 저장합니다.
두 번째 수준 캐시: 쿼리 효율성을 높이기 위해 영구 클래스 개체를 캐시하는 데 사용됩니다.
Hibernate에서는 주석, XML 구성 파일 또는 Java 코드를 통해 엔터티 클래스 간의 관계를 매핑할 수 있습니다. 일반적으로 사용되는 관계에는 일대일, 일대다, 다대일 및 다대다 관계가 있습니다.
一对一关系表示两个实体类之间的关系是一对一的关系。在Hibernate中,可以使用@OneToOne注解来进行映射。
例如,一个Person实体类和一个IDCard实体类之间的关系是一对一的关系,可以使用如下的代码进行映射:
@Entity public class Person { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @OneToOne(mappedBy = "person", cascade = CascadeType.ALL) private IDCard idCard; // getters and setters } @Entity public class IDCard { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String number; @OneToOne @JoinColumn(name = "person_id") private Person person; // getters and setters }
其中,Person实体类中使用了@OneToOne注解来映射与IDCard实体类的关系,属性mappedBy指定了IDCard实体类中的person属性与Person实体类中的idCard属性之间的关系,cascade属性指定了级联操作。
IDCard实体类中使用了@OneToOne注解来映射与Person实体类的关系,属性JoinColumn指定了Person实体类中与IDCard实体类关联的外键列名。
一对多关系表示一个实体类可以对应多个另一个实体类的对象。在Hibernate中,可以使用@OneToMany注解来进行映射。
例如,一个Department实体类中有多个Employee实体类的对象,可以使用如下的代码进行映射:
@Entity public class Department { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @OneToMany(mappedBy = "department", cascade = CascadeType.ALL) private List<Employee> employees; // getters and setters } @Entity public class Employee { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @ManyToOne @JoinColumn(name = "department_id") private Department department; // getters and setters }
其中,Department实体类中使用了@OneToMany注解来映射与Employee实体类的关系,属性mappedBy指定了Employee实体类中的department属性与Department实体类中的employees属性之间的关系,cascade属性指定了级联操作。
Employee实体类中使用了@ManyToOne和@JoinColumn注解来映射与Department实体类的关系,属性JoinColumn指定了Department实体类中与Employee实体类关联的外键列名。
多对一关系表示多个实体类可以对应一个另一个实体类的对象。在Hibernate中,可以使用@ManyToOne注解来进行映射。
例如,一个Employee实体类所属于一个Department实体类,可以使用如下的代码进行映射:
@Entity public class Department { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; // getters and setters } @Entity public class Employee { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @ManyToOne @JoinColumn(name = "department_id") private Department department; // getters and setters }
其中,Employee实体类中使用了@ManyToOne和@JoinColumn注解来映射与Department实体类的关系,属性JoinColumn指定了Department实体类中与Employee实体类关联的外键列名。
多对多关系表示多个实体类之间互相关联。在Hibernate中,可以使用@ManyToMany注解来进行映射。
例如,一个Student实体类可以选择多个Course实体类,一个Course实体类也可以有多个Student实体类,可以使用如下的代码进行映射:
@Entity public class Student { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @ManyToMany(mappedBy = "students", cascade = CascadeType.ALL) private List<Course> courses; // getters and setters } @Entity public class Course { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @ManyToMany @JoinTable( name = "course_student", joinColumns = @JoinColumn(name = "course_id"), inverseJoinColumns = @JoinColumn(name = "student_id") ) private List<Student> students; // getters and setters }
其中,Student实体类中使用了@ManyToMany注解来映射与Course实体类的关系,属性mappedBy指定了Course实体类中的students属性与Student实体类中的courses属性之间的关系,cascade属性指定了级联操作。
Course实体类中使用了@ManyToMany和@JoinTable注解来映射与Student实体类的关系,属性JoinTable指定了关联表的名称和两个实体类之间的关联关系。
위 내용은 Java Hibernate에서 지속성 클래스와 엔터티 클래스 간의 관계는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!