私がやろうとしているのは、Hibernate に Join または select のいずれかに基づいてマップを生成させることです (どちらでも機能します)。その部分は静的に認識されているため、別の選択を行うために DB に行く必要はありません。
そのマップから、ランタイム キーを使用して最終的な値を取得します。以下の表とコードを参照してください
ビジネス ケース: メディア (メール/SMS)、イベント (何が起こったか)、最終的にはユーザー入力など、システム内のさまざまなアラートに対してさまざまなコンテンツを生成できるようにしたいと考えています。グラフィカル チャートを SMS の宛先に送信するのは意味がありませんが、同じイベントが与えられた電子メール (たとえば) には最適です。XSLT スタイル シートを適用するために既存のコードを活用することができ、それが最終的に目指していることです。
これを取り巻く注釈は地獄のように混乱しており、私はおそらくこの問題について完全に間違っていると考えていることを告白します. 私はいくつかの教育と解決策を探しています。
CREATE TABLE AlertProfile(
AlertProfileID BIGINT(20) NOT NULL AUTO_INCREMENT ,
Description VARCHAR(64) NOT NULL,
`Type` enum('EMAIL','SMS','COMPOSITE') NOT NULL,
Destination VARCHAR(32),
PRIMARY KEY (AlertProfileID)
)
タイプの「JOIN」
CREATE TABLE EventTemplates(
EventTemplateID BIGINT(20) NOT NULL AUTO_INCREMENT,
EventName VARCHAR(32) NOT NULL,
`Type` VARCHAR(32) NOT NULL,
TemplateXSLT MEDIUMTEXT NOT NULL,
PRIMARY KEY (EventTemplateID)
)
議論に関係がないと思われる AlertProfiles を含む欠落しているテーブルがいくつかあります。
今、私が働きたいコード:
@Entity
@DiscriminatorValue("EMAIL")
public class EmailAlertProfile extends AlertProfile<String> {
@Basic
@Column(name = "Destination")
private String emailAddress;
@OneToMany(cascade = CascadeType.ALL)
@MapKey(name = "Type")
private Map<String, EventTemplate> nameToTemplate = new HashMap<>();
@Override
public Type getType() {
return Type.EMAIL;
}
@Override
public void sendAlert(EventMessage event) {
// code here to work. Use the event type to select from
// all available email templates
String template = eventTemplates.get(event.getEventType());
String content = event.applyStyleSheet(new Source(template))
VWMessage vw = new VWMessage("no-reply@company.com",emailAddress,event.getSubject(),);
event.setRecipient(emailAddress);
JmsTemplate jmsTemplate = StaticContext.getBean(JmsTemplate.class);
Queue queue = (Queue) StaticContext.getBean("emailQueue");
jmsTemplate.convertAndSend(queue, event);
}
}