您的位置:首页 > 其它

JPA 一对一配置,复合主键均为外键

2013-03-06 15:30 309 查看
这里有个比较奇怪的表对应关于

其中一张表的主键为一个复合主键

并且这个复合主键中的字段均对应另一张表的主键

配置如下

主体类:

@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了一下,大概就是复合主键的问题。

所以按我如上的配置就没问题了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: