2015-06-19 77 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

是的,我喜欢创建一个嵌入式类而不是创建太多分离的文件。谢谢;) –