JPA 一对一配置,复合主键均为外键
2013-03-06 15:30
309 查看
这里有个比较奇怪的表对应关于
其中一张表的主键为一个复合主键
并且这个复合主键中的字段均对应另一张表的主键
配置如下
主体类:
客体类,即对应的一那一方:
其中外键编写如下:
主要就是在平常认为的配置方法上加入@mapsId去对应复合主键中的内容
如果按正常情况下的一对一去配置在复合主键中,即newBranchId 和oldBranchId都配置上oneToOne
那么JPA就反应不过来了,为同一张表设两个主键
而我们需要的只是,aclBranchTransfer分别对应两个InfoBranch的信息
所以程序会报:org.hibernate.ejb.metamodel.SingularAttributeImpl$Identifier cannot be cast to javax.persistence.metamodel.ManagedType
google了一下,大概就是复合主键的问题。
所以按我如上的配置就没问题了。
其中一张表的主键为一个复合主键
并且这个复合主键中的字段均对应另一张表的主键
配置如下
主体类:
@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了一下,大概就是复合主键的问题。
所以按我如上的配置就没问题了。
相关文章推荐
- JPA配置一对多双向并且外键中含联合主键
- Hibernate复合主键作为外键在关联映射中的配置方法
- jpa的复合主键中关系中如何配置才能做到级联删除,我现在的问题是现在有一个学生类一个课程类,下面补充
- Hibernate复合主键中其中有主键是引用外键情况下的配置方法
- 两种方式配置Hibernate复合主键(修正)
- JPA复合主键另一种实现--联合约束
- Hiberante学习08---基于Annotation配置的一对一单向外键关联
- Hiberante学习10---基于Annotation配置的一对一双向外键关联
- Hibernate中复合主键的配置
- Hibernate中复合主键的配置
- 主键共享方式和外键方式一对一双向关系映射(参考张龙老师的例子)
- Hibernate之复合主键映射并总配置文件不引入映射文件
- hibernate复合主键同时做外键
- JPA 菜鸟教程 9 双向一对一唯一外键
- Spring Data JPA使用复合主键
- hibernate一对一主键唯一外键关联(一)
- 一对一单向主键关联xml配置方法
- hibernate整合遗留数据库之处理主键(复合主键中的外键)
- 基于jpa的一对一的主键测试
- Hibernate中复合主键的配置