Java 如何使用JPA(或Hibernate)注释创建复合主对象

Java 如何使用JPA(或Hibernate)注释创建复合主对象,java,spring,hibernate,jpa,Java,Spring,Hibernate,Jpa,我得到了这个问题,这是一个非常常见的问题,我决定在这里分享解决方案 问题是: 我的一个表中有一个复合主键。我需要用JPA注释来映射它 我的建议1: public class Alarm { @Id @Column(name="alm_id") private String id; @Column(name="alm_description") private String desc; @ManyToOne @JoinColumn(na

我得到了这个问题,这是一个非常常见的问题,我决定在这里分享解决方案

问题是: 我的一个表中有一个复合主键。我需要用JPA注释来映射它

我的建议1:

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
}
我的建议2:

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

}

所以我有一个表,它的主键是
设备
+
报警
,我需要映射它

我不想创建一个单独的类来处理带有
@IdClass
注释的主键。所以我决定用
@EmbeddedId
@embeddedable
注释代替。结果是:

@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
    }
}
我仍然需要处理这个对象,以便用hibernate持久化它。因此,我提出了以下建议:

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)

不过,你还是创建了一个内部类。如果需要,还可以为
@IdClass
创建一个内部类。但是作为一种方法,
@embedded
@EmbeddedId
更为现代。是的,我更喜欢创建一个可嵌入类,而不是创建太多的分离文件。。谢谢;)