java - 当一列是派生值时,使用复合键关联两个表

标签 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

因此,根据前面的示例表,有一个 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 表与 ActivityProfilesTicketsWorkflow 表之间关联此 @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/

相关文章:

hibernate - org.hibernate.tool.schema.spi.CommandAcceptanceException : Error executing DDL

java - JAXB - XML 输出中的意外元素

java - 使用 keepalive 时 HttpServer 非常慢

java - 内存游戏的 GUI 组件

java - 在 ant build 中包含 hibernate jar 依赖项

java - Hibernate - 一张表中的三个实体

java - Java中禁用JButton的问题

java - 此 java 对象是否符合 List 中的垃圾回收条件

java - JPA/Hibernate 查询 : load eagerly with subselect

java - 如何在 Hibernate ORM 中将 "lo"别名为 "oid"?