누구든지 Hibernate에서 persist()
vs 의 장점이 무엇인지 말해 줄 수 있습니까 save()
?
답변
에서 이 포럼 게시물
persist()
잘 정의되어 있습니다. 임시 인스턴스를 지속적으로 만듭니다. 그러나 식별자 값이 영구 인스턴스에 즉시 할당되는 것을 보장하지는 않으며 할당시 플러시 시간이 발생할 수 있습니다. 사양에 나와 있지 않은 문제가 있습니다persist()
.
persist()
또한 트랜잭션 경계 외부에서 호출 된 경우 INSERT 문을 실행하지 않도록 보장합니다. 이것은 확장 된 세션 / 지속성 컨텍스트를 가진 장기 대화에서 유용합니다.같은 방법
persist()
이 필요합니다.
save()
동일한 것을 보장하지 않고, 식별자를 반환하며, 식별자를 얻기 위해 INSERT를 실행해야하는 경우 (예 : “시퀀스”가 아닌 “ID”생성기)이 INSERT는 내부 또는 외부에 관계없이 즉시 발생합니다. 거래. 확장 된 세션 / 지속성 컨텍스트를 가진 장기 대화에서는 좋지 않습니다.
답변
로컬 컴퓨터에서 여러 번 실행하는 것을 포함하여 save () vs persist ()에 대한 훌륭한 연구를 수행했습니다. 이전의 모든 설명이 혼란스럽고 정확하지 않습니다. 철저한 연구 끝에 아래 save () 및 persist ()를 비교했습니다.
Save()
- 저장 후 생성 된 ID를 반환합니다. 그것의
Serializable
반환 형식. - 트랜잭션 외부의 DB에 변경 사항을 저장하십시오.
- 생성 된 ID를 유지중인 엔티티에 할당
- 분리 된 객체에 대한 Session.save ()는 테이블에 새로운 행을 만듭니다.
Persist()
- 저장 후 생성 된 ID를 반환하지 않습니다. void 리턴 타입입니다.
- 트랜잭션 외부의 DB에 대한 변경 사항을 저장하지 않습니다.
generated id
지속중인 엔터티 에을 할당합니다session.persist()
분리 된 객체는PersistentObjectException
허용되지 않으므로 throw 됩니다.
이 모든 것은에 시도 / 테스트되었습니다 Hibernate v4.0.1
.
답변
나는 사이의 차이를 기록하는 테스트 일부 모의 한 save()
과 persist()
.
이 두 가지 방법 모두 일시적인 엔티티를 처리 할 때 동일하게 동작하지만 분리 된 엔티티를 처리 할 때는 다릅니다.
아래 예의 경우 EmployeeVehicle을 vehicleId
생성 된 값인 PK를 가진 엔티티 및 vehicleName
특성 중 하나로 사용하십시오.
예 1 : 과도 객체 다루기
Session session = factory.openSession();
session.beginTransaction();
EmployeeVehicle entity = new EmployeeVehicle();
entity.setVehicleName("Honda");
session.save(entity);
// session.persist(entity);
session.getTransaction().commit();
session.close();
결과:
select nextval ('hibernate_sequence') // This is for vehicle Id generated : 36
insert into Employee_Vehicle ( Vehicle_Name, Vehicle_Id) values ( Honda, 36)
이미 유지 된 객체를 가져 와서 저장할 때 결과는 동일합니다.
EmployeeVehicle entity = (EmployeeVehicle)session.get(EmployeeVehicle.class, 36);
entity.setVehicleName("Toyota");
session.save(entity); -------> **instead of session.update(entity);**
// session.persist(entity);
같은 것을 반복해서 사용 persist(entity)
하면 새로운 Id와 같은 결과가 나옵니다 (37, 혼다).
예 2 : 분리 된 객체 다루기
// Session 1
// Get the previously saved Vehicle Entity
Session session = factory.openSession();
session.beginTransaction();
EmployeeVehicle entity = (EmployeeVehicle)session.get(EmployeeVehicle.class, 36);
session.close();
// Session 2
// Here in Session 2 , vehicle entity obtained in previous session is a detached object and now we will try to save / persist it
// (i) Using Save() to persist a detached object
Session session2 = factory.openSession();
session2.beginTransaction();
entity.setVehicleName("Toyota");
session2.save(entity);
session2.getTransaction().commit();
session2.close();
결과 : 이전 세션에서 얻은 id : 36의 차량이 “Toyota”라는 이름으로 업데이트 될 것으로 예상 할 수 있습니다. 그러나 새로운 엔티티가 생성되고 이름이 “Toyota”인 새 엔티티가 DB에 저장됩니다.
select nextval ('hibernate_sequence')
insert into Employee_Vehicle ( Vehicle_Name, Vehicle_Id) values ( Toyota, 39)
지속성을 사용하여 분리 된 엔티티 유지
// (ii) Using Persist() to persist a detached
// Session 1
Session session = factory.openSession();
session.beginTransaction();
EmployeeVehicle entity = (EmployeeVehicle)session.get(EmployeeVehicle.class, 36);
session.close();
// Session 2
// Here in Session 2 , vehicle entity obtained in previous session is a detached object and now we will try to save / persist it
// (i) Using Save() to persist a detached
Session session2 = factory.openSession();
session2.beginTransaction();
entity.setVehicleName("Toyota");
session2.persist(entity);
session2.getTransaction().commit();
session2.close();
결과:
Exception being thrown : detached entity passed to persist
따라서 Transient 객체를 다룰 때 save를 신중하게 사용해야하므로 Save () 대신 Persist ()를 사용하는 것이 좋습니다.
중요 참고 : 위 예제에서 비히클 엔터티의 pk는 생성 된 값이므로 save ()를 사용하여 분리 된 엔터티를 유지하면 최대 절전 모드에서 유지하기 위해 새 ID가 생성됩니다. 그러나이 pk가 생성 된 값이 아닌 경우 키를 위반 한 예외가 발생합니다.
답변
이 질문 에는 최대 절전 모드의 다양한 지속성 방법에 대한 좋은 답변이 있습니다. 질문에 직접 대답하기 위해 save ()를 사용하면 트랜잭션 상태에 관계없이 insert 문이 즉시 실행됩니다. 삽입 된 키를 반환하므로 다음과 같이 할 수 있습니다.
long newKey = session.save(myObj);
따라서 영구 인스턴스에 즉시 할당 된 식별자가 필요한 경우 save ()를 사용하십시오.
persist ()를 사용하면 insert 문이 트랜잭션에서 실행되지만 반드시 즉시 실행되는 것은 아닙니다. 대부분의 경우에 바람직합니다.
트랜잭션에서 삽입이 순서대로 발생하지 않고 삽입 된 키를 리턴 할 필요가없는 경우 persist ()를 사용하십시오.
답변
다음은 persist 및 save 메소드의 장점을 이해하는 데 도움이되는 차이점입니다.
- 저장과 지속의 첫 번째 차이점은 리턴 유형입니다. persist 메소드의 리턴 유형은 void이고 save
메소드 의 리턴 유형 은 Serializable 오브젝트입니다. -
persist () 메소드는 식별자 값이 지속적 상태에 즉시 할당되도록 보장하지 않으며, 플러시 시간에 할당이 발생할 수 있습니다.
-
persist () 메소드는 트랜잭션 경계 외부에서 호출 된 경우 삽입 조회를 실행하지 않습니다. 한편 save () 메서드는 식별자를 반환하므로 삽입 쿼리가 트랜잭션 내부 또는 외부에 있더라도 식별자를 얻기 위해 즉시 실행됩니다.
-
persist 메소드는 트랜잭션 경계 외부에서 호출되며, 확장 된 세션 컨텍스트를 가진 장기 대화에서 유용합니다. 반면, 저장 방법은 확장 된 세션 컨텍스트와 장기 실행 대화에 적합하지 않습니다.
-
Hibernate에서 save와 persist 메소드의 다섯 번째 차이점 : persist는 JPA에서 지원되는 반면 save는 Hibernate에서만 지원됩니다.
Hibernate 의 post 와 save 메소드의 차이점에 대한 전체 작업 예를 볼 수 있습니다
답변
save ()-메소드 이름에서 알 수 있듯이 최대 절전 save ()를 사용하여 엔티티를 데이터베이스에 저장할 수 있습니다. 트랜잭션 외부에서이 메소드를 호출 할 수 있습니다. 트랜잭션없이 이것을 사용하고 엔터티간에 계단식이있는 경우 세션을 비우지 않으면 기본 엔터티 만 저장됩니다.
persist ()-Hibernate persist는 저장 (트랜잭션 사용)과 유사하며 엔티티 객체를 지속적 컨텍스트에 추가하므로 추가 변경 사항이 추적됩니다. 트랜잭션이 커밋되거나 세션이 플러시되기 전에 개체 속성이 변경되면 데이터베이스에도 저장됩니다. 또한, 트랜잭션 경계 내에서만 persist () 메소드를 사용할 수 있으므로 안전하고 계단식 객체를 처리합니다. 마지막으로 persist는 아무것도 반환하지 않으므로 생성 된 식별자 값을 얻으려면 persisted 객체를 사용해야합니다.
답변
차이점은 다음과 같습니다.
-
저장:
- 객체가 데이터베이스에 저장되면 id / identifier를 반환합니다.
- 개체가 분리 된 후 새 세션을 열어서 동일한 작업을 시도 할 때도 저장됩니다.
-
지속 :
- 객체가 데이터베이스에 저장되면 void를 반환합니다.
- 새 세션을 통해 분리 된 객체를 저장하려고하면 PersistentObjectException이 발생합니다.
