这里有个比较奇怪的表对应关于
其中一张表的主键为一个复合主键
并且这个复合主键中的字段均对应另一张表的主键
配置如下
主体类:
@Entity
@Table(name="INFO_BRANCH")
public class InfoBranch extends GenericBean implements IDataObject{
private static final long serialVersionUID = 1918446199175160468L;
@Id
@Column(name = "branchId", unique=true, nullable = false, columnDefinition = "varchar(10)")
private String branchId;
@Column(name = "branchName", columnDefinition = "varchar(75)")
private String branchName;
@Column(name = "creator", columnDefinition = "varchar(10)")
private String creator;
@Column(name = "createTime",nullable = true)
@Temporal(TemporalType.TIMESTAMP)
private Date createTime;
@Column(name = "updater", columnDefinition = "varchar(10)")
private String updater;
@Column(name = "updateTime",nullable = true)
@Temporal(TemporalType.TIMESTAMP)
private Date updateTime;
@Column(name = "deleted", columnDefinition = "varchar(1)")
private String deleted;
@OneToOne(mappedBy="infoBranchNew",cascade = CascadeType.ALL)
private AclBranchTransfer newTransfer;
@OneToOne(mappedBy="infoBranchOld",cascade = CascadeType.ALL)
private AclBranchTransfer oldTransfer;
}
客体类,即对应的一那一方:
@Entity
@Table(name="ACL_BRANCH_TRANSFER")
public class AclBranchTransfer extends GenericBean implements IDataObject{
private static final long serialVersionUID = 1918446199175160469L;
@EmbeddedId
private AclBeanchTransferId id;
@MapsId("newBranchId")
@OneToOne(cascade=CascadeType.ALL)
@JoinColumn(name="newBranch",columnDefinition = "varchar(10)")
private InfoBranch infoBranchNew;
@MapsId("oldBranchId")
@OneToOne(cascade=CascadeType.ALL)
@JoinColumn(name="oldBranch",columnDefinition = "varchar(10)")
private InfoBranch infoBranchOld;
@Column(name = "creator", columnDefinition = "varchar(10)")
private String creator;
@Column(name = "createTime",nullable = true)
@Temporal(TemporalType.TIMESTAMP)
private Date createTime;
@Column(name = "updater", columnDefinition = "varchar(10)")
private String updater;
@Column(name = "updateTime",nullable = true)
@Temporal(TemporalType.TIMESTAMP)
private Date updateTime;
@Column(name = "deleted", columnDefinition = "varchar(1)")
private String deleted;
其中外键编写如下:
@Embeddable
public class AclBeanchTransferId implements Serializable{
private static final long serialVersionUID = 1918446199175160460L;
private String newBranchId;
private String oldBranchId;
主要就是在平常认为的配置方法上加入@mapsId去对应复合主键中的内容
如果按正常情况下的一对一去配置在复合主键中,即newBranchId 和oldBranchId都配置上oneToOne
那么JPA就反应不过来了,为同一张表设两个主键
而我们需要的只是,aclBranchTransfer分别对应两个InfoBranch的信息
所以程序会报:org.hibernate.ejb.metamodel.SingularAttributeImpl$Identifier cannot be cast to javax.persistence.metamodel.ManagedType
google了一下,大概就是复合主键的问题。
所以按我如上的配置就没问题了。