normalian blog

Let's talk about Microsoft Azure, ASP.NET and Java!

Windows Azure 上の WebLogic Server から JPA で SQL Database に接続する

本日は Windows Azure Advent Calendar9日目の記事だ。
WebLogic Server を Windows Azure 上で利用するための情報をまとめて来たが、今回は WebLogic Server から SQL Database に JPAJavaEE 標準の O/R マッパー)を利用して接続する手順もまとめた。以下の記事を未参照の方は、まずは以下の記事を通読して欲しい。

今回紹介する内容は、上記の記事を利用して構築した環境が必須となる点に注意頂きたい。

WebLogic Server で SQL Database を設定するためのアレコレ

ざっくりとは以下の手順が必要となる。

上記をスライドにまとめたので参照して欲しい。

EAR アプリの開発

上記だけではソースコード部分が分かりにくいところもあると思うので、以下に実際に利用したソースコードを記載する。

WAR側のコード
<!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>
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;
	}
}
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>
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;
	}
}
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;
}

上記を追記したアプリケーションを実際に実行させると以下の実行結果となる。