>  기사  >  Java  >  Java Hibernate에서 지속성 클래스와 엔터티 클래스 간의 관계는 무엇입니까?

Java Hibernate에서 지속성 클래스와 엔터티 클래스 간의 관계는 무엇입니까?

王林
王林앞으로
2023-05-08 18:19:181215검색

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 지속성 클래스의 세 가지 상태

Hibernate에서 지속성 클래스에는 일시적 상태, 지속성 상태, 자유 상태의 세 가지 상태가 있습니다.

  • 임시 상태: 영구 클래스 개체는 세션과 연결되지 않았으며 데이터베이스에 저장되지 않았습니다. 이때 수정된 개체의 속성은 데이터베이스에 저장되지 않습니다.

  • 영구 상태: 영구 개체가 데이터베이스에 저장되고 세션과 연결됩니다. 이때 수정된 개체의 속성이 데이터베이스에 저장됩니다.

  • Free 상태: 영속 객체가 데이터베이스에 저장되었지만 더 이상 Session과 관련이 없습니다. 이때 수정된 객체의 속성은 데이터베이스에 저장되지 않습니다.

세션의 저장, 지속, 업데이트 및 병합 메서드를 사용하여 영구 클래스 객체를 임시 상태에서 영구 상태 또는 자유 상태로 변환할 수 있습니다.

save 메소드는 임시 상태 개체를 데이터베이스에 저장하고 영구 상태 개체를 반환하는 데 사용됩니다. 객체가 이미 지속성인 경우 아무 작업도 수행되지 않습니다.

지속 메서드는 임시 상태 개체를 데이터베이스에 저장하는 데 사용되며 지속 상태 개체를 반환하지 않습니다. 객체가 이미 지속성인 경우 아무 작업도 수행되지 않습니다.

업데이트 메서드는 자유 상태 개체를 데이터베이스에 업데이트하고 영구 상태 개체를 반환하는 데 사용됩니다. 객체가 일시적인 경우 예외가 발생합니다.

병합 메소드는 자유 상태 개체를 세션에 병합하고 영구 상태 개체를 반환하는 데 사용됩니다. 객체가 일시적인 경우 객체를 데이터베이스에 저장하고 객체를 지속 상태로 반환합니다.

Hibernate의 첫 번째 수준 캐시

Hibernate의 첫 번째 수준 캐시는 영구 클래스 개체를 캐시하는 데 사용되는 세션 수준 캐시입니다. 데이터베이스에서 영속 클래스 객체를 쿼리할 때 Hibernate는 먼저 첫 번째 수준 캐시에서 이를 검색합니다. 캐시에 존재하지 않으면 데이터베이스에서 쿼리하고 쿼리 결과를 첫 번째 수준 캐시에 넣습니다.

첫 번째 수준 캐시의 수명 주기는 세션의 수명 주기와 동일합니다. 세션이 닫히면 첫 번째 수준 캐시도 지워집니다. 세션의 evict 및clear 메소드를 사용하여 첫 번째 수준 캐시를 지울 수 있습니다.

evict 메소드는 첫 번째 수준 캐시에서 지정된 개체를 제거하여 개체를 자유롭게 만드는 데 사용됩니다.

clear 메소드는 1단계 캐시의 모든 객체를 지우고 모든 영속 객체를 자유 상태로 변경하는 데 사용됩니다.

Hibernate의 트랜잭션 관리

Hibernate에서 트랜잭션은 데이터베이스 작업의 원자성, 일관성, 격리 및 내구성을 보장하는 데 사용됩니다. 트랜잭션 인터페이스를 사용하여 트랜잭션을 관리할 수 있습니다. 예:

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
try {
    // 执行数据库操作
    tx.commit();
} catch (Exception e) {
    tx.rollback();
} finally {
    session.close();
}

트랜잭션에서 세션의 저장, 지속, 업데이트, 병합, 삭제 및 기타 메소드를 사용하여 영구 클래스 객체를 작동하고 작업 결과를 데이터베이스에 저장할 수 있습니다. 거래가 중간에 제출될 때.

Hibernate의 다른 API

위에 소개된 API 외에도 Hibernate는 다음과 같은 많은 다른 API도 제공합니다.

  • Criteria API: 영속 클래스 객체를 동적으로 쿼리하는 데 사용됩니다.

  • HQL(Hibernate Query Language): 영구 클래스 객체를 쿼리하는 데 사용되는 SQL 기반 쿼리 언어입니다.

  • 명명된 쿼리: 쉽게 재사용할 수 있도록 HQL 쿼리 문을 지속성 클래스에 저장합니다.

  • 두 번째 수준 캐시: 쿼리 효율성을 높이기 위해 영구 클래스 개체를 캐시하는 데 사용됩니다.

Hibernate의 엔터티 클래스 관계 매핑

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제