@id없이 최대 절전 모드/지속
-
06-09-2019 - |
문제
진정한 기본 키가없는 결과 세트를 생성하는 데이터베이스보기가 있습니다. 최대 절전 모드/지속성을 사용 하여이 결과를 Java 객체에 매핑하고 싶습니다. 물론 PK가 없기 때문에 어떤 분야도 장식 할 수 없습니다. @Id
.
배포 할 때 최대 절전 모드는 누락 된 것에 대해 불평합니다 @Id
. 이 문제를 어떻게 해결할 수 있습니까?
해결책
행을 고유하게 만드는 열의 조합이있는 경우 열의 조합과 관련하여 기본 키 클래스를 모델링하십시오. 그렇지 않다면, 당신은 기본적으로 운이 좋지 않지만, 아마도 의미가 없기 때문에보기의 디자인을 재검토해야합니다.
몇 가지 다른 접근법이 있습니다.
@Entity
public class RegionalArticle implements Serializable {
@Id
public RegionalArticlePk getPk() { ... }
}
@Embeddable
public class RegionalArticlePk implements Serializable { ... }
또는:
@Entity
public class RegionalArticle implements Serializable {
@EmbeddedId
public RegionalArticlePk getPk() { ... }
}
public class RegionalArticlePk implements Serializable { ... }
세부 사항은 다음과 같습니다. http://docs.jboss.org/ejb3/app-server/hibernateannotations/reference/en/html_single/index.html#d0e1517
다음은 유사한 문제를 설명하는 게시물입니다. http://www.theserverside.com/discussions/thread.tss?thread_id=22638
다른 팁
각 엔티티의 경우 다음 중 하나 이상을 지정해야합니다.
- 하나 @ID
- 다중 @id 및 @idclass (복합 기본 키 용)
- @embeddedid
그렇다면 여러 필드를 포함하는 복합 기본 키를 만들 수 있습니까?
최대 절전 모드에서 해결 방법을 검색하는 대신 데이터베이스보기에서 더미 ID를 추가하는 것이 더 쉬울 수 있습니다. 두 개의 열이있는 PostgreSQL보기가 있다고 가정하고 그 중 어느 것도 고유하지 않다고 가정 해 봅시다 (Postgres가 PK 또는 기타 제약 조건을 볼 수 없기 때문에 기본 키는 없습니다) EX.
| employee_id | project_name |
|:------------|:-------------|
| 1 | Stack01 |
| 1 | Jira01 |
| 1 | Github01 |
| 2 | Stack01 |
| 2 | Jira01 |
| 3 | Jira01 |
------------------------------
다음 쿼리로 표시됩니다.
CREATE OR REPLACE VIEW someschema.vw_emp_proj_his AS
SELECT DISTINCT e.employee_id,
pinf.project_name
FROM someschema.project_info pinf
JOIN someschema.project_employee pe ON pe.proj_id = pinf.proj_id
JOIN someschema.employees e ON e.employee_id = pe.emloyee_id
row_number ()를 사용하여 더미 ID를 추가 할 수 있습니다.
SELECT row_number() OVER (ORDER BY subquery.employee_id) AS row_id
이 예에서와 같이 :
CREATE OR REPLACE VIEW someschema.vw_emp_proj_his AS
SELECT row_number() OVER (ORDER BY subquery.employee_id) AS row_id,
subquery.employee_id,
subquery.project_name
FROM
(SELECT DISTINCT e.employee_id,
pinf.project_name
FROM someschema.project_info pinf
JOIN someschema.project_employee pe ON pe.proj_id = pinf.proj_id
JOIN someschema.employees e ON e.employee_id = pe.emloyee_id ) subquery;
그리고 테이블은 다음과 같습니다.
| row_id | employee_id | project_name |
|:------------|:------------|:-------------|
| 1 | 1 | Stack01 |
| 2 | 1 | Jira01 |
| 3 | 1 | Github01 |
| 4 | 2 | Stack01 |
| 5 | 2 | Jira01 |
| 6 | 3 | Jira01 |
-------------------------------------------
이제 jpa/hibernate/spring 데이터에서 row_id를 @id로 사용할 수 있습니다.
@Id
@Column(name = "row_id")
private Integer id;
예에서와 마찬가지로 :
@Entity
@Table(schema = "someschema", name = "vw_emp_proj_his")
public class EmployeeProjectHistory {
@Id
@Column(name = "row_id")
private Integer id;
@Column(name = "employee_id")
private Integer employeeId;
@Column(name = "project_name")
private String projectName;
//Getters, setters etc.
}
다음은 "ID"키로 2 개의 키가있는 예입니다. https://gist.github.com/3796379
논리 현명한 ID가 있는지 확인하고 그에 따라 매핑 정보를 제공 할 수 있습니다. Hibernate는 정의 된 기본 키가 있는지 데이터베이스를 확인하지 않습니다.
View Creation에 사용되는 선택을 수정하십시오.
SELECT
ROWNUM ID, -- or use nextval of some sequence
-- other columns
FROM
TABLE
"ID"를 기본 키로 매핑하십시오.
다음과 같이 @embeddedid를 사용할 수 있습니다.
@EmbeddedId
public Id getId() {
return id;
}
public void setId(Id id) {
this.id = id;
}
당신이 요구하는 것이 정확히는 아니지만 여기 내가 사용하는 작은 트릭이 있습니다. 쿼리에 "rownum"을 선택하고 모델의 ID 열로 "rownum"을 정의하도록하십시오. 그것은 모든 행을 최대 절전 모드에 효과적으로 만듭니다.