相关疑难解决方法(0)

没有主键或连接表的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")
);
Run Code Online (Sandbox Code Playgroud)

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
);
Run Code Online (Sandbox Code Playgroud)

参考:

PART_RELEASE                 GLOBAL_PART
-------------------          ------------
PART_RELEASE_ID (PK)         GLOBAL_PART_ID (PK)
COLLECTION_ID -------------> RELEASES (UK)
Run Code Online (Sandbox Code Playgroud)

Java的

GlobalPart.java

@Entity
@Table(name = "GLOBAL_PART")
@SequenceGenerator(name = "SEQUENCE_GENERATOR", sequenceName = "GLOBAL_PART_SEQ")
public …
Run Code Online (Sandbox Code Playgroud)

java hibernate one-to-many

16
推荐指数
1
解决办法
4万
查看次数

一对多关联 - 在JPA中连接具有非主键列的表

我正在研究遗留系统,需要从数据库中读取一些信息.以下是表格关系

供应商(vendorId - pk,vendorEid,name)
VendorContactBridge(bridgeId -pk,vendorEid,contactEid)
联系人(contactId -pk,contactEid,phone)

vendorEid和contactEid不是表的主键,而是用作Join表VendorContactBridge中的连接列.

供应商实体 -

@Entity
@Table(name="Vendor")
public class Vendor implements Serializable{

@Id
@Column(name="VENDORID")
private BigDecimal vendorId;

@Column(name="VENDOREID")
private BigDecimal vendorEid;

@OneToMany(fetch = FetchType.EAGER)
@JoinTable(name="VENDORCONTACTBRIDGE", 
joinColumns={@JoinColumn(name="VENDOREID", referencedColumnName="VENDOREID")},
inverseJoinColumns={@JoinColumn(name="CONTACTEID", referencedColumnName="CONTACTEID")})
private Set<Contact> vendorContact;
}
Run Code Online (Sandbox Code Playgroud)

联系实体 -

@Entity
@Table(name="CONTACT")
public class Contact implements Serializable{

@Id
@Column(name="CONTACTID")
private BigDecimal contactId;

@Column(name="CONTATEID")
private BigDecimal contactEId;

@ManyToOne
@JoinTable(name="VENDORCONTACTBRIDGE", 
joinColumns={@JoinColumn(name="CONTACTEID", referencedColumnName="CONTATEID")},
inverseJoinColumns={@JoinColumn(name="VENDOREID", referencedColumnName="VENDOREID")})
private Vendor vendor;
 }
Run Code Online (Sandbox Code Playgroud)

在运行查询时,获得以下异常

SecondaryTable JoinColumn无法引用非主键.

我删除了我在供应商实体中提供的Eager fetch,我没有得到任何异常,但它没有加载集合.关联有什么问题?

hibernate jpa one-to-many hibernate-onetomany

9
推荐指数
1
解决办法
2万
查看次数

标签 统计

hibernate ×2

one-to-many ×2

hibernate-onetomany ×1

java ×1

jpa ×1