【发布时间】:2020-11-15 14:19:08
【问题描述】:
因此,我正在尝试创建一个药房数据库,其中包括跟踪药物与药物之间的相互作用。我有一个拥有各种成员和协会的药物实体,到目前为止,它们似乎都运行良好。我不确定我是否正确的一种实现是使用关联类与 Drug 实体建立递归的多对多关系。关联类 (DrugDrugIX) 有 2 个外键 - 来自每种药物的一个 - 以及该相互作用的严重程度的描述和分配。
到目前为止我所做的工作,因为它将编译和运行,让我添加药物和交互。但是,我当然不认为我正在做的事情是最优化的——甚至不是正确的。关于如何优化我正在尝试做的任何建议?
Drug实体(为简洁起见省略了一些成员):
@Entity
@Table (name = "drugs")
@NamedQueries({
@NamedQuery (name = Drug.FIND_ALL_BY_NAME,
query = "SELECT d FROM Drug d WHERE LOWER (d.chemical_name) LIKE LOWER (CONCAT ('%', :searchString, '%'))" )
})
public class Drug
{
// QUERY STRING(S)
public static final String FIND_ALL_BY_NAME = "Drug.findAllByName";
@Id
@GeneratedValue (strategy = GenerationType.IDENTITY)
private long did;
private String chemical_name;
private String description;
// ASSOCIATION(S)
is this the correct implementation (???)
<----------------------------------------------------------------------------------->
@OneToMany (mappedBy = "base", cascade = CascadeType.PERSIST)
private List<DrugDrugIX> interxAsBase;
@OneToMany (mappedBy = "offender", cascade = CascadeType.PERSIST)
private List<DrugDrugIX> interxAsOffender;
<----------------------------------------------------------------------------------->
@ManyToOne (cascade = CascadeType.PERSIST)
private DEA_Class schedule;
@OneToOne (cascade = CascadeType.PERSIST)
private Pharmacology PK_profile;
(...) other associations, getters and setters here (...)
public void addInterxAsBase (DrugDrugIX interaction)
{
if (this.interxAsBase == null)
interxAsBase = new ArrayList<>();
interxAsBase.add (interaction);
}
public void addInterxAsOffender (DrugDrugIX interaction)
{
if (this.interxAsOffender == null)
interxAsOffender = new ArrayList<>();
interxAsOffender.add (interaction);
}
}
DrugDrugIX 关联实体:
@Entity
@Table (name = "drug_drug_interactions")
public class DrugDrugIX
{
@EmbeddedId
private DrugDrugIX_PK interaction_CPK;
private int severityLevel = -1;
// ASSOCIATION(S)
@ManyToOne
@MapsId ("base")
private Drug base;
@ManyToOne
@MapsId ("offender")
private Drug offender;
(...) getters, setters omitted for brevity (...)
public void registerInteraction (Drug object, Drug precipitate)
{
if (this.base == null)
this.base = object;
if (this.offender == null)
this.offender = precipitate;
if ((this.base == object && this.offender == precipitate) && (severityLevel == -1))
{
object.addInterxAsBase(this);
precipitate.addInterxAsOffender(this);
}
}
}
...为了后代,Embeddable 包含 DrugDrugIX 实体的主键:
@Embeddable
public class DrugDrugIX_PK implements Serializable
{
private long base;
private long offender;
private String description;
// CONSTRUCTORS
public DrugDrugIX_PK () {}
public DrugDrugIX_PK (Drug base, Drug offender, String description)
{
this.base = base.getDID();
this.offender = offender.getDID();
this.description = description;
}
// ACCESSORS
public String getDescription () { return this.description; }
// MISCELLANEOUS
@Override
public boolean equals (Object other)
{
if (other instanceof DrugDrugIX_PK)
{
DrugDrugIX_PK second = (DrugDrugIX_PK) other;
return (this.base == second.base) && (offender == second.offender) && (this.description.equals (description));
}
else
return false;
}
@Override
public int hashCode () { return (int) (base + offender); }
}
我向stackoverflow大神祈求指导..
【问题讨论】:
标签: java jpa many-to-many model-associations