Java 如何使用JPA(或Hibernate)注释创建复合主对象
我得到了这个问题,这是一个非常常见的问题,我决定在这里分享解决方案 问题是: 我的一个表中有一个复合主键。我需要用JPA注释来映射它 我的建议1: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
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
更为现代。是的,我更喜欢创建一个可嵌入类,而不是创建太多的分离文件。。谢谢;)