视图无主键字段时,使用Hibernate @Id注解的正确使用
hibernate在使用时,对每一个数据实体类,需要使用@Id注明主键字段,当注解的字段并非真正意义主键(唯一不重复),会导致操作异常。eg:@Id注解的字段在视图中并不唯一时会导致查询结果可能出现重复数据,而重复的数据实际标记@Id字段值一样。
处理方式
- 创建视图时增加主键列。
- 使用@Embeddable标记联合主键实体类,在@Entity注解的实体中引入并使用@Id注解。
@Data
@Entity
@Table(name="cux_ep_projvendor_v", schema = Constants.DB_APPS_PREFIX)
public class SupplierView implements Serializable {
@Column(name="PROJECT_ID")
private Long projectId;
@Column(name="PROJECT_NAME")
private String projectName;
@Column(name="PJSTATUS")
private String pjstatus;
@Column(name="VENDOR_ID")
private Long vendorId;
@Column(name="PARTY_ID")
private Long partyId;
@Transient
private Long poNumber;
@Id
private SupplierCombinationId combinationId;
@Embeddable
@Data
public static class SupplierCombinationId implements Serializable{
@Column(name="PROJECT_NUMBER")
private String projectNumber;
@Column(name="VENDOR_NAME")
private String vendorName;
}
}