【问题标题】:Atypic JPA OneToOne relation非典型 JPA OneToOne 关系
【发布时间】:2015-06-06 15:02:36
【问题描述】:

我在使用 JPA 时遇到问题。

我必须要桌子:

-----------------
| TableA        |
|---------------|
| ID: INT       |
| ...           |
| ESTATUS1: INT |
| ESTATUS2: INT |
-----------------

-----------------
| EstatusTags   |
|---------------|
| COD: VARCHAR  |---> COD and VALUE are a concatenated PK
| VALUE: INT    |
| DESC: VARCHAR |
-----------------

EstatusTags 是一个表,用于存储给定 COD 对 [VALUE, DESC] 的集合。

在我使用 JPA 之前,我曾经以这样的方式查询此类数据:

SELECT ID, ESTATUS1, ESTATUS2, E1.DESC DESC1, E2.DESC DESC2
FROM TABLEA A
    INNER JOIN ESTATUSTAGS E1 ON E1.COD = "a_estatus1" 
        AND E1.VALUE = A.ESTATUS1
    INNER JOIN ESTATUSTAGS E2 ON E2.COD = "a_estatus2" 
        AND E2.VALUE = A.ESTATUS2

我正在尝试使用 JPA 使用两个实体类对此进行建模:

@Entity
@Table(name = "EstatusTags")
public class EstatusTags implements Serializable {

    @EmbeddedId
    private ValueTagPK id;

    @Column(name="VVA_DESC")
    private String desc;

    @Column(name="VVA_ORDEN")
    private Integer orden;
}

@Entity
@Table(name = "TableA")
public class A implements Serializable {

    @Column(name="ID")
    private String desc;

    @OneToOne(???)
    private EstatusTag estatus1;

    @OneToOne(???)
    private EstatusTag estatus2;
}

我对如何建模关系有很大的疑问。可以用注释来完成吗?有必要使用 JPQL 来适应这种结构吗?

我希望有人可以帮助我。

非常感谢。

【问题讨论】:

  • A desc 类中,字符串被映射到ID 列,根据您的表,该列是一个整数。那没有意义。在表A 中,ID 是主键吗?还有A类引用EstatusTag,因为你的类被命名为EstatusTags

标签: java jpa


【解决方案1】:

问题是您的实体模型与表结构不匹配。 在您的实体模型中,AEstatusTag 之间存在一对一的关系,而在表模型中,您有一个 A 和多个 Estatustags 的关系(对于一个 value,可能存在多个 Etatustags 条目)

通过在 SQL 查询中添加虚拟 codE1.COD = "a_estatus1" 之类的内容,您克服了表 A 没有 cod 列的问题。

您可以做的是将value 的列映射到EstatusTag 的两个属性,一次映射到复合pk,另一次映射到单个属性,如下所示。简单的value 可以通过属性访问来访问,但标记为不可更新不可插入,setter 也不能真正工作,而是设置为private
备注:我不知道这是否适用于所有 JPA 实现 - 使用 hibernate 4.3.8 测试。

@Entity
@Table(name = "EstatusTags" )
@Access(AccessType.FIELD)
public class EstatusTag implements Serializable{


    private @EmbeddedId ValueTagPK id;

    @Column(name="VVA_DESC")
    private String desc;

    @Column(name="VVA_ORDEN")
    private Integer orden;



    @Column(name="value", updatable=false, insertable=false)
    @Access(AccessType.PROPERTY)
    public int getValue() {
        return id.value;
    }

    private void setValue(int value) {
        // only because otherwise hibernate complains about a missing setter.
    }

}

@Entity
@Table(name = "TableA")
public class A implements Serializable{


    @Id
    @Column(name="ID")
    @GeneratedValue(strategy=GenerationType.TABLE)
    private int id;

    @OneToOne()
    @JoinColumn(name="estatus1",referencedColumnName="value")
    public EstatusTag estatus1;

    @OneToOne()
    @JoinColumn(name="estatus2",referencedColumnName="value")
    public EstatusTag estatus2;


}

【讨论】:

    猜你喜欢
    • 2023-03-12
    • 1970-01-01
    • 2019-08-12
    • 1970-01-01
    • 2020-08-01
    • 1970-01-01
    • 2021-05-22
    • 1970-01-01
    • 2015-06-22
    相关资源
    最近更新 更多