2015-06-19 3 views
0

У меня возникла эта проблема, которая является очень распространенной проблемой, и я решил поделиться разрешением здесь.Как создать составной первичный элемент с аннотациями JPA (или Hibernate)

Проблема: У меня есть составной первичный ключ в одной из моих таблиц. Мне нужно сопоставить это с аннотациями JPA.

Мой POJO1:

public class Alarm { 

    @Id 
    @Column(name="alm_id") 
    private String id; 

    @Column(name="alm_description") 
    private String desc; 

    @ManyToOne 
    @JoinColumn(name = "alm_norm_id") 
    private Alarm normAlarm; 

    //getters and setters 
} 

Мой POJO2:

public class Equipment { 

    @Id 
    @Column(name="equ_id") 
    private String id; 

    @Column(name="equ_fixed_asset") 
    private String fixedAsset; 

    @Column(name="equ_service_tag") 
    private String serviceTag; 

    //getters and setters 

} 

Поэтому у меня есть таблица, в которой первичный ключ является Equipment + Alarm и мне нужно отобразить это.

ответ

0

Я не хотел создавать отдельный класс только для обработки первичного ключа с аннотацией @IdClass. Поэтому я решил вместо этого использовать аннотации @EmbeddedId и @Embeddable. В результате получилось:

@Entity 
@Table(name="Alarm_Counter") 
public class Counter { 

    @EmbeddedId 
    private CounterId id; 

    @Column(name="aco_counter") 
    private int counter = 1; 

    @Column(name="aco_last_reset") 
    private Date resetDate; 

    public Counter(){} 

    public Counter(CounterId id) { 
     super(); 
     this.id = id; 
    } 


    //Getters and Setters 

    //... 

    //Embeddable class for handling primary key 
    @Embeddable 
    public class CounterId implements Serializable{ 

     /** 
     * 
     */ 
     private static final long serialVersionUID = 1L; 

     @ManyToOne 
     @JoinColumn(name="aco_alarm_id") 
     private Alarm alarm; 

     @ManyToOne 
     @JoinColumn(name="aco_equipment_id") 
     private Equipment equipment; 

     //Default Constructor 
     public CounterId(){} 

     //Constructor with fields 
     public CounterId(Alarm alarm, Equipment equipment) { 
      super(); 
      this.alarm = alarm; 
      this.equipment = equipment; 
     } 

     //Getters and Setters 
    } 
} 

Мне все еще нужно было обрабатывать этот объект для сохранения его в спящем режиме. Поэтому я сделал следующее:

Alarm al = alarmService.get(alarm);     //Retrieve an Alarm object 
Equipment eq = equipmentService.get(equipment);  //Retrieve an Equipment object 

Counter ct = new Counter();       //Instantiates a Counter object 
CounterId cId = ct.new CounterId(alarm, equipment); //Instantiates a CounterId object (composite primary key for Counter) 

ct.setId(cId);          //Sets the primary key (CounterId) 
+0

Ну, вы все же закончили тем, что создали внутренний класс. Если бы вы захотели, вы могли бы создать внутренний класс для '@ IdClass'. Но, как подход, '@ Embeddable' и' @ EmbeddedId' являются более современными. –

+0

Да, я предпочитаю создавать вложенные классы вместо создания слишком большого количества разделенных файлов .. Спасибо;) –

Смежные вопросы