Java 開発者として Play Framework 2.1.1 を使い始めたばかりです。
既存のデータベースからいくつかの eBeans を取得しました。RESTful クライアント Web アプリケーションからそれらの Bean を提供および保存するための RESTful アーキテクチャを構築しています。
次の Bean 定義があります。フィードは、アプリケーションのコア オブジェクトです。簡単にするために、ゲッターとセッター、および他の多くの Bean は含めていません。問題を引き起こすものに焦点を当てています。
@Entity
public class Feed extends Model implements Serializable
{
@Id
Long feedId;
...
...
...
@JsonManagedReference("feed-item")
@OneToMany(fetch = FetchType.LAZY, mappedBy = "feed")
List<Item> items;
@JsonManagedReference("feed-userFeed")
@OneToMany(fetch = FetchType.LAZY, mappedBy = "feed")
List<UserFeed> userFeeds;
}
@Entity
public class Item extends Model implements Serializable
{
@Id
Long itemId;
...
...
...
Long urlId;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "url_id")
Url url;
@Formats.DateTime(pattern = "yyyy-MM-ddThh:mm:ss")
Timestamp itemPublishedAt;
@Formats.DateTime(pattern = "yyyy-MM-ddThh:mm:ss")
Timestamp itemUpdatedAt;
@Formats.DateTime(pattern = "yyyy-MM-ddThh:mm:ss")
Timestamp createdAt;
@Version
Timestamp updatedAt;
Long feedId;
@ManyToOne(fetch = FetchType.LAZY)
@JsonBackReference("item-feed")
@JoinColumn(name = "feed_id")
Feed feed;
Long urlId;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "url_id")
Url url;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "item")
@JsonManagedReference("item-unseen")
List<Unseen> unseen;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "item")
@JsonManagedReference("item-score")
List<Score> scores;
}
@Entity
public class User extends Model implements Serializable
{
@Id
Long userId;
...
...
...
@OneToMany
@JsonManagedReference("user-userFeed")
List<UserFeed> userFeeds;
@OneToMany
@JsonManagedReference("user-userTag")
List<UserTag> userTags;
@OneToMany
@JsonManagedReference("user-unseen")
List<Unseen> unseen;
@OneToMany
@JsonManagedReference("user-score")
List<Score> scores;
}
@Entity
public class Score extends Model implements Serializable
{
@Id
Long scoreId;
...
...
...
Long itemId;
@ManyToOne(fetch=FetchType.LAZY)
@JsonBackReference("score-item")
@JoinColumn(name = "item_id")
Item item;
Long userId;
@ManyToOne(fetch=FetchType.LAZY)
@JsonBackReference("score-user")
@JoinColumn(name = "user_id")
User user;
}
これが私のフィードコントローラーです:
import me.zenfeed.model.Feed;
import org.codehaus.jackson.JsonNode;
import play.db.ebean.Model;
import play.libs.Json;
import play.mvc.BodyParser;
import play.mvc.Controller;
import play.mvc.Result;
public class FeedController extends Controller
{
public static Result delete(Long id)
{
new Model.Finder<>(Long.class, Feed.class).byId(id).delete();
return ok();
}
/* return a JSON with all of the objects found*/
public static Result get()
{
return ok(Json.toJson(new Model.Finder<>(Long.class, Feed.class).fetch("userFeeds", new FetchConfig().query()).where().eq("userFeeds.userId", Long.parseLong(session("connectedUserId"))).findList()));
}
/* accept a JSON with the object to save and return a JSON with the new object*/
@BodyParser.Of(BodyParser.Json.class)
public static Result post()
{
JsonNode json = request().body().asJson();
Feed f = Json.fromJson(json, Feed.class);
f.save();
return ok(Json.toJson(f));
}
/* accept a JSON with the object to save and return a JSON with the new object*/
@BodyParser.Of(BodyParser.Json.class)
public static Result put(Long id)
{
JsonNode json = request().body().asJson();
Feed f = Json.fromJson(json, Feed.class);
f.update(id);
return ok(Json.toJson(f));
}
}
これは、いくつかのパラメーターを使用してDBでクエリを作成するために使用するカスタム関数です。
List<Item> l = new Model.Finder<>(Long.class, Item.class)
.select("itemId, feedId, urlId, title, description, content, author, categories, itemPublishedAt, itemUpdatedAt, wordCount, fresh, vector, createdAt, updatedAt")
.fetch("unseen", "itemId", new FetchConfig().query())
.fetch("scores", "score", new FetchConfig().query())
.fetch("feed.userFeeds", "userId", new FetchConfig().query())
.where()
.eq("feed.userFeeds.userId", Long.parseLong(session("connectedUserId")))
.eq("feed.feedId", feedId)
.orderBy("scores.score")
.findList();
助けてほしい問題がいくつかあります。
間違ったチュートリアルを見たことがわかりました。@JsonManagedReference と @JsonBackReference の引数は同じでなければなりません。したがって、フィードとアイテムの関係の場合、正しい注釈は @JsonManagedReference("feed-item") と @JsonBackReference("feed-item") です。
- ご覧のとおり、Timestamp オブジェクトを HTML5 のような形式でフォーマットしようとしましたが、うまくいきませんでした。私はいつもロングナンバーを取得します。Date オブジェクトに変換する必要がありますか? はいの場合、どこですか?
気になるプロパティの HashMap を手動で生成し、それを Json.toJson() メソッドに渡しました。
ご協力ありがとうございました。