我有两个现有的,高度规范化的表格(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
因此,在前面的示例表中,有一个活动是个人"'Finished' ordering his pizza"
我正在尝试用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
}
如何将@OneToOne
表与Status
,Activity
,Profiles
,Tickets
表之间的Workflow
映射关联起来?< / p>
答案 0 :(得分:0)
我假设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。
答案 1 :(得分:0)
这是适用于我的解决方案
@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;
@OneToMany
@Where(value="table_name='Activity'")
@JoinTable(name="STATUS", joinColumn=@JoinColumn(name="id"),
reverseJoinColumn=@JoinColumn(name="record_id")
private Set<StatusDb> status; // Had to to make 1:M to use where clause
// setters/getters
// equals/hashCode
}