我想要做的是让 Hibernate 根据 Join 或 select 为我生成一个 Map (无论哪个有效)。该部分是静态已知的,因此我不必去数据库进行单独的选择。
然后,我想从该 Map 中使用运行时键来获取最终值。请参阅下面的表格和代码
商业案例:我们希望能够为系统中的各种警报生成不同的内容:媒介(电子邮件/短信)、事件(发生了什么)以及最终的用户输入。将图形图表发送到 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);
}
}