Windows Azure 上の WebLogic Server から JPA で SQL Database に接続する
本日は Windows Azure Advent Calendar9日目の記事だ。
WebLogic Server を Windows Azure 上で利用するための情報をまとめて来たが、今回は WebLogic Server から SQL Database に JPA(JavaEE 標準の O/R マッパー)を利用して接続する手順もまとめた。以下の記事を未参照の方は、まずは以下の記事を通読して欲しい。
- WebLogic Server 12c を Windows Azure の Windows Server 2012 R2 で動かしてみる id:waritohutsu:20131130:1385804228
- Eclipse を使った JavaEE6 環境(主にWebLogic Server)を簡単に用意して開発してみる on Windows Azure id:waritohutsu:20131206:1386320343
今回紹介する内容は、上記の記事を利用して構築した環境が必須となる点に注意頂きたい。
WebLogic Server で SQL Database を設定するためのアレコレ
ざっくりとは以下の手順が必要となる。
上記をスライドにまとめたので参照して欲しい。
EAR アプリの開発
上記だけではソースコード部分が分かりにくいところもあると思うので、以下に実際に利用したソースコードを記載する。
WAR側のコード
- index.xhtml
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core"> <f:loadBundle basename="resources.application" var="msg" /> <head> <title><h:outputText value="#{msg.welcomeTitle}" /></title> </head> <body> <h3> <h:outputText value="#{msg.welcomeHeading}" /> </h3> <p> <h:outputText value="#{msg.welcomeMessage}" /> </p> <h:form> <h:dataTable value="#{viewDto.erogeList}" var="eroge" border="1"> <h:column> <f:facet name="タイトル"></f:facet> <h:outputText value="#{eroge.name}" /> </h:column> <h:column> <f:facet name="価格"></f:facet> <h:outputText value="#{eroge.price}円" /> </h:column> <h:column> <f:facet name="コメント"></f:facet> <h:outputText value="#{eroge.comment}" /> </h:column> </h:dataTable> <h:commandButton action="#{indexAction.doAction()}" value="アクション実行" /> </h:form> </body> </html>
- IndexAction.java
package org.mydomain.action; import javax.inject.Inject; import javax.inject.Named; import org.mydomain.dto.ViewDto; import org.mydomain.logic.IndexLogic; @Named public class IndexAction { @Inject IndexLogic indexLogic; @Inject ViewDto viewDto; public String doAction() { String result = "0"; System.out.println("!!!! do action"); viewDto.setErogeList(indexLogic.doLogic()); return result; } }
- ViewDto.java
package org.mydomain.dto; import java.io.Serializable; import java.util.List; import javax.enterprise.context.ConversationScoped; import javax.inject.Named; import org.mydomain.entity.Eroge; @Named @ConversationScoped public class ViewDto implements Serializable { private List<Eroge> erogeList; public List<Eroge> getErogeList() { return erogeList; } public void setErogeList(List<Eroge> erogeList) { this.erogeList = erogeList; } }
EJB側のコード
- META-INF/persistence.xml
<?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0"> <persistence-unit name="em" transaction-type="JTA"> <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> <jta-data-source>JDBC_Data_Source</jta-data-source> </persistence-unit> </persistence>
- IndexLogic.java
package org.mydomain.logic; import java.util.List; import javax.ejb.Stateless; import javax.inject.Named; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import org.mydomain.entity.Eroge; @Named @Stateless public class IndexLogic { @PersistenceContext private EntityManager em; public List<Eroge> doLogic() { System.out.println("!!!! do logic"); List<Eroge> resultList = em.createQuery("select k from Eroge k", Eroge.class).getResultList(); return resultList; } }
- Eroge.java
package org.mydomain.entity; import java.io.Serializable; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table(schema = "dbo", name = "Eroge") public class Eroge implements Serializable { @Id @Column(name = "Id") private int id; @Column(name = "Price") private int price; @Column(name = "Name") private String name; public int getPrice() { return price; } public void setPrice(int price) { this.price = price; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getComment() { return comment; } public void setComment(String comment) { this.comment = comment; } @Column(name = "Comment") private String comment; }