hibernate - 如何使用多对一关系从 mysql 数据库中获取没有主键实体
问题描述
我在从不包含任何主键(弱实体)的表中获取数据时遇到问题。我有两张桌子 -Data
和Prescription
. Prescription
里面有一个主键 -并且包含多于 1 行,其中包含有关token_id
单个. 我怎么能这样做?我无法向表中添加任何主键。该表已提供给我,因此我无法更改。Data
token_id
我尝试并遵循了 YouTube 中的一些教程,但没有奏效。我还在stackoverflow中检查了一些答案,但这似乎与我的api结构不符。我完全被困住了。我尝试@MantToOne
按照教程中所示使用,然后将存储库用于函数,但这似乎不起作用。
我有两个模型类 - Data.java
@Repository
@Entity
@Table(name="data")
public class Data {
@Column(name="ticket_no")
private String ticket_no;
@Column(name="type")
String type;
@Column(name="unit")
private String unit;
@Column(name="value")
private float value;
@ManyToOne
private Prescription pres;
//getters and setters
}
处方.java
@Entity
@Table(name="prescriptions")
public class Prescription {
@Id
@Column(name="ticket_no")
private String ticket_no;
@Column(name="description")
String description;
@Column(name="download_link")
private String download_link;
//getters and setters
两个存储库:DataRepository.java
public interface DataRepository extends JpaRepository<Data, String> {
public List<Data> findByPrescriptionTicket_no(String token);
}
PrescriptionRepository.java
public interface PrescriptionRepository extends JpaRepository<Prescription, String> {
}
两个 Dao 类:DataDao.java
@Service
public class DataDao {
@Autowired
DataRepository datarepo;
public List<Data> findOne(String token) {
List<Data> meddat=new ArrayList<>();
datarepo.findByPrescriptionTicket_no(token).forEach(meddat::add);
return meddat;
}
}
处方道.java
@Service
public class PrescriptionDao {
@Autowired
PrescriptionRepository presrepo;
public Prescription findOne(String token) {
return presrepo.findOne(token);
}
}
控制器类
@RestController
@RequestMapping(value = "/rest/users")
public class MainController {
@Autowired
DataDao datadao;
@Autowired
PrescriptionDao presdao;
@Autowired
ProcessData pd;
@GetMapping("/persons")
public String loadPersons(@RequestParam("access_token") String access_token) throws ParseException{
String decode_token = pd.testDecodeJWT(access_token);
String token = pd.jsondata(decode_token);
String pres=presdao.findOne(token).toString();
List<Data> med= datadao.findOne(token);
String tot_data= "{"+"\"medical_data\":"+med+","+"\"hb_prescription\":"+pres+"}";
return tot_data;
}
}
实际上,我将整个程序从简单地从两个表中获取数据转换为这个程序,因此可能会出现多个错误。我对这个概念很陌生,但我必须为项目提交这样做。如果结果在数据列表中,那就太好了。
提前致谢。
解决方案
您不能拥有没有主键的实体:
从规范:
2.4 主键和实体身份
每个实体都必须有一个主键。
必须在作为实体层次结构根的实体类或映射超类上定义主键,该映射超类是实体层次结构中所有实体类的(直接或间接)超类。主键必须在实体层次结构中只定义一次。
因此,您必须创建数据字段的主键。
如果它们组合起来是唯一的,您可以创建一个像这样的复合键:
public class DataKey implements Serializable {
@Id
private String ticket_no;
@Id
String type;
@Id
private String unit;
@Id
private float value;
// getters, setters, equals and hashCode implementations
}
@Entity
@Table(name="data")
@IdClass(DataKey.class)
public class Data {
@Id
@Column(name="ticket_no")
private String ticket_no;
@Id
@Column(name="type")
String type;
@Id
@Column(name="unit")
private String unit;
@Id
@Column(name="value")
private float value;
@ManyToOne
private Prescription pres;
//getters and setters
}
推荐阅读
- symfony - 使用变量名中的 index.loop 创建和设置 twig 变量的值
- java - 如何在 Google Places Api 中同时按距离和使用半径进行排序?
- amazon-ec2 - 获取当前的 ec2 计数 - 或另一个来自数字 id
- c++ - "setprecision()" 和浮点数
- javascript - 如何更改作为内部 html 一部分的一个元素的引导类?
- apache-kafka - 当存储值为 Avro SpecificRecord 时,KafkaStreamsStateStore 不起作用
- html - 向右渲染控件不适用于 style="float: right"
- r - 如何使用 R 从 Zillow API 响应输出中获取 XML 元素的文本?
- c# - 在表单发布之前捕获 URL
- c++ - 如何查看 .ktx 纹理内部?