문제

진정한 기본 키가없는 결과 세트를 생성하는 데이터베이스보기가 있습니다. 최대 절전 모드/지속성을 사용 하여이 결과를 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"을 정의하도록하십시오. 그것은 모든 행을 최대 절전 모드에 효과적으로 만듭니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top