JPA/EJB/JSF を使用して Java EE6 プロジェクトに取り組んでおり、エンティティの複数言語サポートの設計に問題があります。関連する 3 つのエンティティがあります。
Language (ID あり)
Competence (ID あり)
CompetenceName (Competence リファレンス、Language リファレンス、および文字列を含む)
Competence には、Map で実装された CompetenceName への 1 対多の参照があり、Competence の名前が存在する言語ごとに 1 つのオブジェクトが含まれています。コンピテンスは動的に作成されるため、その名前はリソース バンドルに存在できないことに注意してください。
コンピテンスを Web ページに一覧表示するときに、現在ログインしているユーザーの言語で表示するようにしたいのですが、これはセッション スコープのマネージド Bean に格納されています。
優れた MVC 設計を壊さずにこれを達成する良い方法はありますか? 私の最初のアイデアは、FacesContext を介して Competence エンティティの「getName」メソッドからセッション スコープ Bean を直接取得し、次のように CompetenceNames のマップを調べることでした。
public class Competence
{
...
@MapKey(name="language")
@OneToMany(mappedBy="competence", cascade=CascadeType.ALL, orphanRemoval=true)
private Map<Language, CompetenceName> competenceNames;
public String getName(String controller){
FacesContext context = FacesContext.getCurrentInstance();
ELResolver resolver = context.getApplication().getELResolver();
SessionController sc = (SessionController)resolver.getValue(context.getELContext(), null, "sessionController");
Language language = sc.getLoggedInUser().getLanguage();
if(competenceNames.get(language) != null)
return competenceNames.get(language).getName();
else
return "resource missing";
}
このソリューションは、エンティティがコントローラー レイヤーに依存しており、その名前が必要になるたびにセッション コントローラーを取得する必要があるため、非常に粗雑に感じられます。より MVC に準拠したソリューションは、Language パラメーターを使用することですが、これは、JSF からのすべての呼び出しに、セッション スコープのマネージド Bean からフェッチされた言語を含める必要があることを意味し、これも適切なソリューションとは思えません。
この問題に対する考えや設計パターンはありますか?