我有两个现有的高度标准化的表(Activity
和 Status
)
Create table Activity (
id Number(10,0) not null,
description varchar2(4000) not null,
create_date date not null
);
Create table Status (
table_name varchar2(20) not null,
record_id number(10,0) not null,
status_description varchar2(4000)
);
在本例中,Status
表通过以下方式与 Activity
表相关:
STATUS.TABLE_NAME = 'Activity' and STATUS.RECORD_ID = ACTIVITY.ID
它也可以与许多其他表相关(除了 ACTIVITY):
STATUS.TABLE_NAME = 'Scores' and STATUS.RECORD_ID = SCORE.ID
STATUS.TABLE_NAME = 'Submissions' and STATUS.RECORD_ID = submission.ID
STATUS.TABLE_NAME = 'Tickets' and STATUS.RECORD_ID = TICKET.ID
STATUS.TABLE_NAME = 'Profiles' and STATUS.RECORD_ID = Profile.ID
- STATUS TABLE -
table_name | record_id | status_decription
----------- | ----------- | -----------
'Activity' | **12** | 'Finished'
'Profiles' | 100 | 'Completed'
'Scores' | 200 | 'Calculated'
'Tickets' | 1000 | 'Paid'
- ACTIVITY TABLE -
id | description
----------- | -------------
10 | blah, blah
11 | hey there..
**12** | order pizza
13 | pick up icecream
因此,根据前面的示例表,有一个 Activity ,其中一个人“'完成'订购了披萨”
我正在尝试与 Hibernate 创建这种关系,但是我似乎无法弄清楚这两个类之间的映射。
@Entity(name="status")
@Table(name="Status")
public class StatusDb {
@Column(name="table_name")
private String tableName;
@Column(name="record_id")
private String recordId;
@Column(name="status_desc")
private String description;
// setters/getters
// equals/hashCode
}
@Entity(name="actvity")
@Table(name="Activity")
public class ActivityDb {
@Column(name="id")
@Id
private Long id;
@Column(name="description")
private String description;
// setters/getters
// equals/hashCode
}
如何在 Status
表与 Activity
、Profiles
、Tickets
、Workflow
表之间关联此 @OneToOne
映射?
最佳答案
我假设 ActivityDb 是关系的“父级”。
我将按如下方式映射我的实体:
StatusDb
@Entity(name="status")
@Table(name="Status")
public class StatusDb {
@Column(name="table_name")
private String tableName;
@OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumnsOrFormulas({
@JoinColumnOrFormula(formula=@JoinFormula(value="tableName = 'Activity'"),
@JoinColumnOrFormula(column = @JoinColumn("record_id",
referencedColumnName="id"))
})
private ActivityDb activityDb;
@Id
@Column(name="record_id")
private String recordId;
@Column(name="status_desc")
private String description;
// setters/getters
// equals/hashCode
}
ActivityDb
@Entity(name="actvity")
@Table(name="Activity")
public class ActivityDb {
@Column(name="id")
@Id
private Long id;
@Column(name="description")
private String description;
@OneToOne(mappedBy = "activityDb")
private StatusDb statusDb;
}
现在,当 ActivityDb 实体的 id 确定后,在提交事务时,相关 StatusDb 实体将自动使用该 ActivityDb 的 id 填充 record_id。
关于java - 当一列是派生值时,使用复合键关联两个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43004326/