gpt4 book ai didi

java - 组合列上的 JPA OneToMany

转载 作者:行者123 更新时间:2023-12-01 10:21:29 25 4
gpt4 key购买 nike

首先,这是一个遗留数据库,架构无法更改。现在假设我有下表:

-----------      -----------
| table A | | table B |
----------- -----------
| id_A |----->| id_B |
| col_A | | col_B |
----------- -----------

表A是主表,表B是明细表。id_A 和 id_B 都是字符串,但 id_B = id_A + 4 个字符。

例如,如果id_A =“0000000123”,则有多个id_B,如下所示“00000001230001”,“00000001230002”,“00000001230003”,...是的,我知道,那应该是另一列。正如我所说,这是一个遗留数据库,我就是这样发现的。

我正在使用 Spring Data JPA、JPA2 和 Hibernate。我需要的是定义实体:

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

@Column(name = "id_A", length = 10, unique = true, nullable = false)
private String idA;

@Column(name = "col_A")
private String colA;

@OneToMany <-- WHAT MORE GOES HERE TO REFERENCE JUST THE SUBSTRING OF THE DETAIL id_B?
private List<B> detail;
}

@Entity
@Table(name="B")
public class B {

@Column(name = "id_B", length = 14, unique = true, nullable = false)
private String idB;

@Column(name = "col_B")
private String colB;
}

我不知道如何引用我需要的是 substr(id_b, 1, 10) = id_A

我怎样才能做到这一点?

最佳答案

我能看到的唯一解决方案是在数据库级别创建 View 。如果满足某些条件,MySQL 支持可更新 View ,并且我们应该可以读取和写入。

http://dev.mysql.com/doc/refman/5.7/en/view-updatability.html

(MySQL 的最新版本还支持生成列,这可能是 View 的替代方案 ( http://mysqlserverteam.com/generated-columns-in-mysql-5-7-5/ )

创建 View :

create view VW_TABLE_B
as
select *,
substring(..) as a_id
from B

实体 B 映射到 View :

@Entity
@Table(name="VW_TABLE_B")
public class B {

@Id
@Column(name = "id_B", length = 14)
private String id;

@Column(name = "col_B")
private String colB;

protected void setId(String id){
this.id = id;
}
}

从 JPA 的角度来看,我们是否使用 View 、具体表或其他内容并不重要。然后,从实体 A 到实体 B 的关系可以成为标准映射,其中联接列指向 View 中的派生值。

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

@Id
@Column(name = "id_A", length = 10)
private String id;

@Column(name = "col_A")
private String colA;

@OneToMany
@JoinColumn(name = "a_id")
private List<B> detail;

public void addB(B b){
b.setId(this.id + new DecimalFormmat("0000").format(detail.size() + 1);
detail.add(b);
)
}

关于java - 组合列上的 JPA OneToMany,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35576905/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com