我将在Play 2.1(Scala)中实现一个只读的Web应用程序.因为我只会读取和封送读取到JSON的数据,所以我想避免任何其他的DSL和映射.
我使用dapper-dot-net在.NET/C#中完成了类似的项目,并且对事情的结果非常满意.没有大惊小怪,锅炉板也不多.
我目前正在关注:
我正在尝试建模一个父实体,该实体具有子实体的集合(childHistory)以及指向最后添加的子实体(currentChild)的指针
class Parent {
//unidirectional
@OneToOne(cascade = CascadeType.PERSIST, optional = false)
@JoinColumn(name = "current_child_id")
private Child currentChild;
//bidirectional
@OneToMany(mappedBy = "parent")
private List<Child> childHistory;
public Parent() {
currentChild = new Child(this);
childHistory = new ArrayList<>();
childHistory.add(currentChild);
}
public void add() {
currentChild = new Child(this);
childHistory = new ArrayList<>();
childHistory.add(currentChild);
}
}
class Child {
@ManyToOne(optional = false)
@JoinColumn(name = "parent_id")
private Parent parent;
public Child(Parrent parent) {
this.parent = parent;
}
}
Run Code Online (Sandbox Code Playgroud)
目前,当我尝试保存父级(并依靠级联来持久化子级)时,我遇到了瞬态实体的异常。我无法事先保存父级,因为我初始化了父级构造函数中的所有内容。
警告(导致异常......):
警告:HHH000437:尝试保存与未保存的瞬态实体具有不可为空关联的一个或多个实体。在保存这些依赖实体之前,必须在操作中保存未保存的瞬态实体。未保存的临时实体:
([com.Parent#<null>])相关实体:([[com.Child#<null>]])不可为 …
我试图概括我用于从Play动作返回Json的一个函数.
我目前这样做:
def JsendOkObj(obj: JsValue) = Ok(Json.obj("status" -> "success", "data" -> obj))
Run Code Online (Sandbox Code Playgroud)
并称之为:
JsendOkObj(Json.toJson(myObj))
Run Code Online (Sandbox Code Playgroud)
我想做更多的事情:
def JsendOkObj[A](obj: A) = Ok(Json.obj("status" -> "success", "data" -> Json.toJson(obj)))
Run Code Online (Sandbox Code Playgroud)
然后称之为:
JsendOkObj(myObj)
Run Code Online (Sandbox Code Playgroud)
其中Json.toJson被定义为:
def toJson[A](implicit arg0: Writes[A]): Enumeratee[A, JsValue]
Run Code Online (Sandbox Code Playgroud)
我编译的错误是我需要定义一个类型的Writes A.这是不可能的,因为我不知道哪种类型A最终会成为:
没有找到类型A的Json反序列化器.尝试为此类型实现隐式写入或格式.