Карта JPA 2.0‹Целое, Сущность›

Я хотел бы сохранить карту с Integer, Entity, но JPA хранит встроенную сущность, поэтому я получаю такую ​​​​ошибку:

Ошибка усечения при попытке сжать VARCHAR '곭獲4捯洮瑨潭慳灥牯畴歡⹡汰瑩浩湧⹭潤敬⹈慲摷慲敆潯瑰物湴���Ȁౌ彰敲獩獴敽敽 整捨䝲潵灴,䱯牧⽥捬楰獥⽰敲獩獴&' на длину 255..

Как я могу заставить JPA хранить только идентификатор объекта?

РЕДАКТИРОВАТЬ:

@ElementCollection
private Map<Integer, Footprint> footprints = new LinkedHashMap<>();

person perotom    schedule 16.10.2014    source источник
comment
Пожалуйста, добавьте код вашей карты к вопросу.   -  person unwichtich    schedule 16.10.2014
comment
Уже сделано. Целое число должно представлять положение следа   -  person perotom    schedule 16.10.2014
comment
По определению ElementCollection не содержит сущностей. ElementCollection содержит базовые типы или встроенные типы. То, что вы хотите, это OneToMany.   -  person JB Nizet    schedule 16.10.2014
comment
как получить карту с коллекцией onetomany?   -  person perotom    schedule 17.10.2014


Ответы (2)


Я бы не сказал, что это невозможно с @ElementCollection, но вам, вероятно, нужна однонаправленная связь @OneToMany.

Если целое число в вашей карте действительно является идентификатором соответствующего объекта Footprint, конструкция Map также будет избыточной.

Попробуйте что-то вроде этого:

@Entity
public class Something {

  @Id
  @Column(name="SOME_ID")
  private long id;   

  @OneToMany(fetch=FetchType.EAGER, cascade = CascadeType.ALL)
  @JoinColumn(name="SOMETHING_ID", referencedColumnName="SOME_ID")
  private List<Footprint> footprints = new LinkedList<>();

}

См. также:

person unwichtich    schedule 19.10.2014
comment
это хорошо, но я хочу добавить дополнительное целое число, которое не является идентификатором объекта. Таблица должна иметь два свойства: идентификатор посадочного места и дополнительное целое число, которое отличается. - person perotom; 20.10.2014

Допустим, ваша сущность Footprint определена следующим образом:

<!--language: java-->

    @Entity
    public class Footprint {
        @Id
        private String id;                 //PK of Footprint

        @ManyToOne                         //owning side of the relationship
        @JoinColumn(name = "id_something") //FK of Something
        private Something something;
    }

В общем случае для отображений типа Map<Basic, Entity> ключ можно смоделировать двумя способами:

  1. @MapKeyColumn аннотация создает дополнительный столбец в объекте Footprint (владеющая сторона отношения) для хранения ключа карты

    @Entity
    public class Something {
        @Id
        private Integer id;
    
        @OneToMany(mappedBy = "something")   //non-owning side of the relationship
        @MapKeyColumn(name = "id_footprint") //specifies the map's key
        private Map<Integer, Footprint> footprints = new LinkedHashMap<>();
    }
    

    Приведенное выше отношение создаст соответствующие таблицы базы данных:

    Footprint
    --------------------
    id            int PK
    id_something  int FK
    id_footprint  int     <-- referenced by the map's key
    
    Something
    --------------------
    id            int PK
    
  2. @MapKey аннотация НЕ создает дополнительный столбец в объекте Footprint (владеющая сторона отношения), а ключ карты сохраняется как часть объекта путем ссылки на его первичный ключ:

    @Entity
    public class Something {
        @Id
        private Integer id;
    
        @OneToMany(mappedBy = "something") //non-owning side of the relationship
        @MapKey(name = "id")               //refers to Footprint's primary key
        private Map<Integer, Footprint> footprints = new LinkedHashMap<>();
    }
    

    Приведенное выше отношение создаст соответствующие таблицы базы данных:

    Footprint
    --------------------
    id            int PK  <-- referenced by the map's key
    id_something  int FK
    
    Something
    --------------------
    id            int PK
    
person wypieprz    schedule 26.10.2014