Scala的Play Framework文档显示了一个隐式地将表单映射到案例类的示例:
case class User(name: String, age: Int)
val userForm = Form(
mapping(
"name" -> text,
"age" -> number
)(User.apply)(User.unapply)
)
Run Code Online (Sandbox Code Playgroud)
我们注意到在这个独特的样本中只使用了原始值.
如果我们做这个改动怎么样:
case class Car(brandName: String)
case class User(name: String, car: Car)
Run Code Online (Sandbox Code Playgroud)
而且,让我们假设表单返回User
的名称(String)和一个carId
(String)
val userForm = Form(
mapping(
"name" -> text,
"car" -> carRepository.findById(nonEmptyText) // concept I wish
)(User.apply)(User.unapply)
)
Run Code Online (Sandbox Code Playgroud)
有没有办法在这个希望的线路上实例化一辆汽车,carId
例如表格提供的一些汽车并确保它carId
不是空的String
?
我刚刚从Tomcat迁移到JBoss AS 7.因此,我在JBoss中配置了Mysql数据源(添加了带有关联Jar的module.xml,将驱动程序块添加到standalone.xml并通过JBoss接口配置数据源).
部署时没有错误但是不可能获得entityManager(后台有Hibernate的JPA).
实际上,当执行此代码时:
Persistence.createEntityManagerFactory("RoomManagement");
Run Code Online (Sandbox Code Playgroud)
我得到了这个错误:
javax.persistence.PersistenceException:没有名为RoomManagement的EntityManager的持久性提供程序javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:69)javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:47)
非常奇怪,因为我很好地验证了我的persistence.xml确实发生在WEB-INF/classes/META-INF目录下的War中.
我的persistence.xml如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
<persistence-unit name="RoomManagement" transaction-type="JTA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>java:jboss/datasources/MySqlDS</jta-data-source>
<class>com.parisdescartes.roommanagement.domain.entities.Address</class>
<class>com.parisdescartes.roommanagement.domain.entities.Building</class>
<class>com.parisdescartes.roommanagement.domain.entities.Civility</class>
<class>com.parisdescartes.roommanagement.domain.entities.EventType</class>
<class>com.parisdescartes.roommanagement.domain.entities.Job</class>
<class>com.parisdescartes.roommanagement.domain.entities.Reservation</class>
<class>com.parisdescartes.roommanagement.domain.entities.Room</class>
<class>com.parisdescartes.roommanagement.domain.entities.RoomType</class>
<class>com.parisdescartes.roommanagement.domain.entities.Tool</class>
<class>com.parisdescartes.roommanagement.domain.entities.User</class>
<class>com.parisdescartes.roommanagement.domain.entities.UserDetail</class>
<class>com.parisdescartes.roommanagement.domain.entities.Schedule</class>
<properties>
<property name="hibernate.connection.autocommit" value="true" />
<property name="hibernate.archive.autodetection" value="class"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hbm2ddl.auto" value="update"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
</properties>
</persistence-unit>
</persistence>
Run Code Online (Sandbox Code Playgroud)
我犯了错误或忘记指定某事吗?
在检查ArrayList API时,我注意到一些看起来很奇怪的东西.
实际上,这里是ArrayList构造函数实现,其Collection作为参数传递:
public ArrayList(Collection<? extends E> c) {
elementData = c.toArray();
size = elementData.length;
// c.toArray might (incorrectly) not return Object[] (see 6260652)
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, size, Object[].class);
}
Run Code Online (Sandbox Code Playgroud)
这里相当于HashSet类:
public HashSet(Collection<? extends E> c) {
map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
}
Run Code Online (Sandbox Code Playgroud)
因此,我们可以注意到ArrayList使用了参数集合中提供的COPY(Arrays.copyOf)元素,而HashSet则使用了addAll()方法.
当然,addAll()方法不会复制元素,只是添加对HashSet集合的引用.
我发现这个subtil的区别对于忽略它的调用者来说是"危险的".
人们可以期待一个带有SAME引用的集合,另一个读取ArrayList API的人会期望从原始Collection中复制元素.
为什么Sun没有为那些Collections子类提供相同的概念?
假设这段代码:
def main(args: Array[String]) {
val func = (x: String, y :String) => x + ", " + y
println(myFunc(func))
}
def myFunc(f: (String, String) => String) = {
f("Hey","how are you?")
}
Run Code Online (Sandbox Code Playgroud)
此代码的第二行被编译器替换为:
val func = new Function2[String, String, String] {
def apply(x: String, y: String): String = x + ", " + y
}
Run Code Online (Sandbox Code Playgroud)
我可以推断,func
在这种情况下,该类型也对应于(String, String) => String)
类型,如myFunc
签名所示; 意思Function2[String, String, String]
是与...相同的类型(String, String) => String
.
为什么不同的符号?为什么Scala编译器还没有将函数文字转换为某种概念:new ((String, String) …
我想安装NPM提供的lessc.(在OSX上)
首先,我安装了当前版本的NodeJ:0.10.15.
它包括NPM.
现在我启动着名的命令:
npm install -g lessc
我得到了这个错误:
npm install -g lessc
npm http GET https://registry.npmjs.org/lessc
npm http GET https://registry.npmjs.org/lessc
npm http GET https://registry.npmjs.org/lessc
npm ERR! Error: UNABLE_TO_VERIFY_LEAF_SIGNATURE
npm ERR! at SecurePair.<anonymous> (tls.js:1350:32)
npm ERR! at SecurePair.EventEmitter.emit (events.js:92:17)
npm ERR! at SecurePair.maybeInitFinished (tls.js:963:10)
npm ERR! at CleartextStream.read [as _read] (tls.js:463:15)
npm ERR! at CleartextStream.Readable.read (_stream_readable.js:320:10)
npm ERR! at EncryptedStream.write [as _write] (tls.js:366:25)
npm ERR! at doWrite (_stream_writable.js:219:10)
npm ERR! at writeOrBuffer (_stream_writable.js:209:5)
npm ERR! at …
Run Code Online (Sandbox Code Playgroud) 假设String
:Point(123 456)
.
什么是一个有效和干净的方式来提取和分配123
和456
(as String
)Tuple2
一次?
我做了什么:
val str = "Point(123 456)"
val tab = str.stripPrefix("Point(").stripSuffix(")").split("\\s")
val tuple2 = (tab(0), tab(1))
println(tuple2) // displays the (123,456)
Run Code Online (Sandbox Code Playgroud)
蛮丑的 ...
我刚刚阅读了Neo4j官方文档的这一页.
它显示了一种Cypher方式来专门检索朋友的朋友:
MATCH (joe { name: 'Joe' })-[:knows*2..2]-(friend_of_friend)
WHERE NOT (joe)-[:knows]-(friend_of_friend)
RETURN friend_of_friend.name, COUNT(*)
ORDER BY COUNT(*) DESC , friend_of_friend.name
Run Code Online (Sandbox Code Playgroud)
为什么以下方式更快?:
MATCH path = shortestPath((joe { name: 'Joe' })-[:KNOWS*..2]-(friend_of_friend))
WHERE length(path) = 2
WITH nodes(path)[-1] AS secondDegreeFriends //retrieving the friend_of_friend nodes
RETURN secondDegreeFriends._name, COUNT(*)
ORDER BY COUNT(*) DESC , secondDegreeFriends.name
Run Code Online (Sandbox Code Playgroud)
(对于第二个查询,33ms vs 22ms,两者都在图中的182个成员的上下文中)
我们假设这个用例:
"获取所有传递的事件2013/05/12 20:00
到2013/05/14 21:00
".
实现这种情况下,Neo4j的第一种方式是使索引的属性:
事件(startAt:...,ENDAT:...) (startAt
和endAt
被索引)
这将导致扫描具有与实际查询相对应的属性的所有事件.
我刚读过的其他方式:
问题是:在这种情况下,节点遍历在性能方面要好于处理日期的索引属性吗?
让我们假设这四个字符串列表:
List("123::foo")
List("456::bar")
List("123::hello")
List("456::scala")
Run Code Online (Sandbox Code Playgroud)
什么是最终的有效方式:
List("123","foo","hello")
List("456","bar","scala")
Run Code Online (Sandbox Code Playgroud)
并期望为大量的初始列表工作.
关于cyper请求的摘录:(假设element
在整个请求中是已知的节点变量)
MATCH p = shortestPath(element-[:LINKS*..3]-(user))
RETURN length(p)
Run Code Online (Sandbox Code Playgroud)
假设一个element
可能是a user
,我怎么能阻止在结果中检索element
代表用户本身?
如果我们可以这样做会很酷:
MATCH p = shortestPath(element-[:LINKS*1..3]-(user))
RETURN length(p)
Run Code Online (Sandbox Code Playgroud)
但它导致了这个错误:
shortestPath(...) does not support a minimal length
Run Code Online (Sandbox Code Playgroud)
实现这一伎俩最有效的方法是什么?