JPA를 사용하여 Map <String, String> 저장


103

주석을 attributes사용하여 JPA2를 사용하여 다음 클래스에서지도 를 유지할 수 있는지 궁금합니다.

public class Example {
    long id;
    // ....
    Map<String, String> attributes = new HashMap<String, String>();
    // ....
}

이미 기존 프로덕션 데이터베이스가 있으므로의 값이 attributes 다음 기존 테이블에 매핑 될 수 있습니다.

create table example_attributes {
    example_id bigint,
    name varchar(100),
    value varchar(100));

답변:


201

JPA 2.0은 컬렉션 지원 @ElementCollection과 함께 사용할 수 있는 주석을 통해 기본 요소 컬렉션을 지원합니다 java.util.Map. 다음과 같이 작동합니다.

@Entity
public class Example {
    @Id long id;
    // ....
    @ElementCollection
    @MapKeyColumn(name="name")
    @Column(name="value")
    @CollectionTable(name="example_attributes", joinColumns=@JoinColumn(name="example_id"))
    Map<String, String> attributes = new HashMap<String, String>(); // maps from attribute name to value

}

참조 (JPA 2.0 사양)

  • 2.6-포함 가능한 클래스 및 기본 유형 컬렉션
  • 2.7지도 컬렉션
  • 10.1.11-ElementCollection 주석
  • 11.1.29 MapKeyColumn 주석

1
JPA 1을 사용하여이를 수행하는 해결 방법이 있습니까? 나는 단지 예제를 찾았습니다Map<String, SomeOtherClass>
L. Holanda 2014

3
hbm2ddl이 위에서 생성 example_attributes하는 복합 키 가 있어야한다는 점을 언급 할 가치가 있습니다 (example_id, name).
James Bassett 2014

위의 예를 시도했지만 엔터티를 유지하려고 할 때 예외가 발생합니다.이 테이블에 대해 하나 이상의 매핑을 정의해야합니다. 쿼리 : InsertObjectQuery (null). 힌트가 있습니까? 빈 엔터티를 만들고 속성 맵을 설정 한 다음 유지하려고합니다.
Kamila

2
MariaDB를 사용 Specified key was too long; max key length is 767 bytes하여이 작업 을 수행했습니다. 생성하려는 기본 키는 varchar (255)와 @JoinColumn의 조합으로 기본 열 크기를 초과합니다. 당신도 할 필요가 데이터베이스를 변경 길이를 제공하거나 @MapKeyColumn를 수정 :@MapKeyColumn(name="name", length=100)

18
  @ElementCollection(fetch = FetchType.LAZY)
  @CollectionTable(name = "raw_events_custom", joinColumns = @JoinColumn(name =     "raw_event_id"))
  @MapKeyColumn(name = "field_key", length = 50)
  @Column(name = "field_val", length = 100)
  @BatchSize(size = 20)
  private Map<String, String> customValues = new HashMap<String, String>();

열 및 테이블 이름과 필드 길이를 제어하여 맵을 설정하는 방법에 대한 예입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.