【发布时间】:2020-02-19 22:51:04
【问题描述】:
所以我有两个表,我想在 Spring 内存中进行查询。 我已经成功地在一个名为 Medicine 的条目中对“Drugs”表进行建模,但是现在需要对“drugInteraction”表进行建模 - 该表将结合 drug_id(PK 在医学表中称为 id)和 drugInteraction 中的 drug_name表,作为组合主键。
python 中使用的模式:
cursor.execute("CREATE TABLE drugs(id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255), description TEXT, toxicity TEXT)")
cursor.execute("CREATE TABLE drugInteractions (drug_id INT NOT NULL, name VARCHAR(90), description TEXT, PRIMARY KEY(drug_id, name), FOREIGN KEY (drug_id) REFERENCES drugs (id))")
drugInteractions 表的一些示例数据:
drug_id name description
1 "Abciximab" "The risk or severity of bleeding can be increased when Abciximab is combined with Lepirudin."
1 "Aceclofenac" "The risk or severity of bleeding and hemorrhage can be increased when Aceclofenac is combined with Lepirudin."
1. "Acemetacin" "The risk or severity of bleeding and hemorrhage can be increased when Lepirudin is combined with Acemetacin."
药物表的一些示例数据:
id. name. description
1 "Lepirudin" "Lepirudin is identical to...."
2 "Cetuximab" "Cetuximab is an epidermal growth..."
这就是我所拥有的 Medicine.java:
package com.example.configbackendspring;
import net.minidev.json.JSONObject;
import javax.persistence.*;
@Entity
@Table(name = "drugs")
public class Medicine {
@Id
@GeneratedValue
@Column(name = "id")
private Integer id;
@Column(name = "name")
private String name;
@Column(name = "description")
private String description;
@Column(name = "toxicity")
private String toxicity;
public Medicine(int id, String name, String description, String toxicity) {
this.id=id;
this.name=name;
this.description=description;
this.toxicity=toxicity;
}
public Medicine(){}
public int getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getToxicity() {
return toxicity;
}
public void setToxicity(String toxicity) {
this.toxicity = toxicity;
}
public JSONObject toJSONObject(){
JSONObject object = new JSONObject();
JSONObject medicineObject = new JSONObject();
medicineObject.appendField("name", this.name);
medicineObject.appendField("description", this.description);
medicineObject.appendField("toxicity", this.toxicity);
medicineObject.appendField("id", this.id);
object.appendField("medicine", medicineObject);
return object;
}
}
这就是我对 drugInteraction.java 所拥有的......它不起作用
package com.example.configbackendspring;
import net.minidev.json.JSONObject;
import javax.persistence.*;
import javax.resource.cci.Interaction;
import java.io.Serializable;
@Entity
@Table(name = "drugInteractions")
public class DrugInteraction {
@EmbeddedId
private InteractionId interactionId;
@Column(name = "description")
private String description;
public DrugInteraction(int drug_id, String name, String description) {
this.interactionId.drug_name = name;
this.interactionId.drug_id = drug_id;
this.description=description;
}
public DrugInteraction(){}
public Integer getId() {
return interactionId.drug_id;
}
public String getName() {
return interactionId.drug_name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public JSONObject toJSONObject(){
JSONObject object = new JSONObject();
JSONObject interactionObject = new JSONObject();
interactionObject.appendField("name", interactionId.drug_name);
interactionObject.appendField("description", this.description);
interactionObject.appendField("drug_id", interactionId.drug_id);
object.appendField("drugInteraction", interactionObject);
return object;
}
}
这是 InteractionId.java
package com.example.configbackendspring;
import lombok.*;
import java.io.Serializable;
@RequiredArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@ToString
@EqualsAndHashCode
public class InteractionId implements Serializable
{
// public InteractionId(int drug_id, String drug_name){
// this.drug_id=drug_id;
// this.drug_name=drug_name;
//
// }
@NonNull
public int drug_id;
@NonNull
public String drug_name;
}
我目前的问题是我无法弄清楚如何将药物中的外键 id 与复合键链接起来。 上面的代码正在编译,但数据库是空的,所以导入一定是在某处失败
请问,有人可以建议我如何更改文件以模拟上述行为吗?我无法弄清楚如何使用外键对复合 ID 建模
【问题讨论】:
-
问题如堆栈跟踪中所述。实体需要标识符。您的
DrugInteraction实体类没有使用@Id注释的字段,因此无法创建EntityManager。 -
我想弄清楚@Id 应该是什么......因为它是一个带有嵌入外键的复合键,我不知道应该在那里
-
感谢您的文章。我阅读并设法得到:
@RequiredArgsConstructor @NoArgsConstructor @Getter @Setter @ToString @EqualsAndHashCode public class InteractionId implements Serializable { @NonNull public int drug_id; @NonNull public String drug_name; }但我不知道如何在这个复合键中引用药物表中的外键 ID。文章不涉及外键 -
在这种情况下,外键不相关;唯一标识符是。将映射到
drugId和name列的属性添加到您的可嵌入类并使用@Id注释它们
标签: mysql spring hibernate spring-boot spring-data-jpa