java - 当我在主键中共享列(但不仅限于)时如何映射 jpa 实体
问题描述
我必须在很多这样的情况下维护/改进遗留系统。这个例子
create table COMPANY(
COMP_ID_COMPANY NUMBER(10),
COMP_NAME VARCHAR(32),
/*... MANY FIELDS*/
PRIMARY KEY (COMP_ID_COMPANY)
);
create table BUSINESS_UNIT(
BUZZ_ID_COMPANY NUMBER(10),
BUZZ_ID_BUZZUNIT NUMBER(10),
/*... MANY FIELDS*/
PRIMARY KEY (BUZZ_ID_COMPANY, BUZZ_ID_BUZZUNIT),
CONSTRAINT FK_BUZZ_COMP FOREIGN KEY (BUZZ_ID_COMPANY) REFERENCES COMPANY (COMP_ID_COMPANY)
)
create table BRANCH(
BRAN_ID_COMPANY NUMBER(10),
BRAN_ID_BRANCH NUMBER(10),
BRAN_NAME VARCHAR(32),
/*... MANY FIELDS*/
BRAN_ID_BUZZUNIT NUMBER(10) nullable, /*HERE IS THE PROBLEM*/
PRIMARY KEY (BRAN_ID_COMPANY, BRAN_ID_BRANCH),
CONSTRAINT FK_BRAN_BUZZ FOREIGN KEY (BRAN_ID_COMPANY, BRAN_ID_BUZZUNIT) REFERENCES BUSINESS_UNIT (BUZZ_ID_COMPANY, BUZZ_ID_BUZZUNIT) /*HERE IS THE PROBLEM*/
);
前两个单元的映射很简单,我必须为 COMPANY PK 创建一个类并使用@EmbeddedId 和@Embeddable 进行注释。但是,在 Branch 课上我有这个问题
@Embeddable
class BranchPk{
@Column(name="BRAN_ID_COMPANY")
private Long branIdCompany;
@Column(name="BRAN_ID_BRANCH")
private Long branIdBranch;
}
@Entity
@Table(name="BRANCH"
class Branch {
@EmbeddedId
private BranchPk pk;
@ManyToOne
@JoinColumns({
@JoinColumn(name="BRAN_ID_COMPANY", insertable=false, updatable=false), //I cannot keep this field insertable or updatable because makes part of the primary key
@JoinColumn(name="BRAN_ID_BUZZUNIT"), //JPA doesn't allow me to mix the insertable/updatable fields with noninsertable/nonupdatable ones
})
private BusinessUnit businessUnit;
}
问题是:我如何映射此类允许 businessUnit 属性为空而不从 PK 中删除 branIdCompany?我希望只使用 JPA 来解决这个问题,但是使用休眠特性对我来说不是问题。
解决方案
推荐阅读
- scala - Spark sql group by和sum改变列名?
- java - 我如何用java语言对数据进行分组和转换
- css - 带有 iframe 的引导模式仅在 iPhone 上不允许垂直滚动
- java - 在我的代码中出现错误如何解决?
- node.js - 快速选择机器人框架
- java - 为 SPA 应用程序集成 openid 连接的最佳方式
- javascript - 自定义 Mozilla Firefox 滚动条
- express - 访问 socketio 端点时未调用 Express 中间件
- android - 如何使用 GSON 解析 JSON,以获取 JSONObject 未按需要解析的错误 JSON?
- r - pvclust 编辑树状图