当一列是派生值时,将两个表与复合键相关联

时间:2017-03-24 16:13:00

标签: java hibernate jpa one-to-one

我有两个现有的,高度规范化的表格(ActivityStatus

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表与StatusActivityProfilesTickets表之间的Workflow映射关联起来?< / p>

2 个答案:

答案 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
}