没有主键或连接表的Hibernate多对一关系
问题
我想首先说我意识到数据库结构很糟糕,但我现在无法改变它。
话虽这么说,我需要在Hibernate(4.2.1)中创建一对多,双向关系,它不涉及主键(只有关系的“父”侧的唯一键)而且没有连接表。 表示此关系的外键是从“子”到“父”的后向指针(见下文)。 我搜索并尝试了各种不同的注释配置而没有运气。 我要求的是可能的吗?
数据库
GLOBAL_PART
CREATE TABLE "GLOBAL_PART" ( "GLOBAL_PART_ID" NUMBER NOT NULL, "RELEASES" NUMBER, CONSTRAINT "GLOBAL_PART_PK" PRIMARY KEY ("GLOBAL_PART_ID"), CONSTRAINT "GLOBAL_PART_RELEASES_UK" UNIQUE ("RELEASES") );
PART_RELEASE
CREATE TABLE "PART_RELEASE" ( "PART_RELEASE_ID" NUMBER NOT NULL, "COLLECTION_ID" NUMBER, CONSTRAINT "PART_RELEASE_PK" PRIMARY KEY ("PART_RELEASE_ID"), CONSTRAINT "GLOBAL_PART_RELEASE_FK" FOREIGN KEY ("COLLECTION_ID") REFERENCES "GLOBAL_PART" ("RELEASES") ON DELETE CASCADE ENABLE );
参考:
PART_RELEASE GLOBAL_PART ------------------- ------------ PART_RELEASE_ID (PK) GLOBAL_PART_ID (PK) COLLECTION_ID -------------> RELEASES (UK)
Java的
GlobalPart.java
@Entity @Table(name = "GLOBAL_PART") @SequenceGenerator(name = "SEQUENCE_GENERATOR", sequenceName = "GLOBAL_PART_SEQ") public class GlobalPart extends ModelBase implements Serializable { private static final long serialVersionUID = 1L; @Id @Column(name = "GLOBAL_PART_ID", unique = true, nullable = false) @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQUENCE_GENERATOR") private Long globalPartId; @OneToMany(fetch = FetchType.EAGER) @JoinColumn(name = "COLLECTIONGID") private Set releases; public Long getGlobalPartId() { return globalPartId; } public void setGlobalPartId(Long globalPartId) { this.globalPartId = globalPartId; } public Set getReleases() { return releases; } public void setReleases(Set releases) { this.releases = releases; } }
PartRelease.java
@Entity @Table(name = "PART_RELEASE") @SequenceGenerator(name = "SEQUENCE_GENERATOR", sequenceName = "PART_RELEASE_SEQ") public class PartRelease extends ModelBase implements Serializable { private static final long serialVersionUID = 1L; @Id @Column(name = "PART_RELEASE_ID", unique = true, nullable = false) @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQUENCE_GENERATOR") private String partReleaseId; @ManyToOne @JoinColumn(name = "RELEASES") private GlobalPart globalPart; public String getPartReleaseId() { return partReleaseId; } public void setPartReleaseId(String partReleaseId) { this.partReleaseId = partReleaseId; } public GlobalPart getGlobalPart() { return globalPart; } public void setGlobalPart(GlobalPart globalPart) { this.globalPart = globalPart; } }
任何帮助将不胜感激!!
首先,在双向关联中,始终存在用于定义映射的所有者侧,以及由mappedBy
属性的存在标记的反向侧。
在OneToMany关联中,所有者方总是多方(在您的情况下为PartRelease)。
此外,默认情况下,连接列引用它引用的实体的ID。 由于它不是您想要的,您必须指定引用的列名称。
当然,必须映射RELEASES列:
public class GlobalPart extends ModelBase implements Serializable { @OneToMany(fetch = FetchType.EAGER, mappedBy = "globalPart") private Set partReleases; @Column(name = "RELEASES") private Long releasesNumber; } public class PartRelease extends ModelBase implements Serializable { @ManyToOne @JoinColumn(name = "COLLECTION_ID", referencedColumnName = "RELEASES") private GlobalPart globalPart; }
文档中很好地描述了关联。 你应该读它。
如本文所述 ,无论何时需要使用父端的非主键列映射@ManyToOne
,都必须使用@JoinColumn
批注的referencedColumnName
属性。
@ManyToOne(fetch = FetchType.LAZY) @JoinColumn( name = "RELEASES", referencedColumnName = "COLLECTIONGID" )
我为@ManyToOne
使用了@ManyToOne
因为默认情况下使用了EAGER提取,这对性能非常不利 。
- 未设置’hibernate.dialect’时,连接不能为空
- NoSuchMethodError:org.hibernate.SessionFactory.getCurrentSession()
- 如何在hibernate / jpa实体中使用“size”作为字段名?
- 使用Hibernate(JPA)查询Postgresql没有找到表
- 以编程方式使用动态用户名和密码配置Hibernate
- GenericJDBCException:无法打开连接..由javax.resource.ResourceException引起:IJ000459:事务处于非活动状态
- Hibernate hql,在同一个查询中执行多个更新语句
- java.net.SocketException:管道损坏
- Hibernate双向@ManyToOne,更新非拥有方不工作