我有一个用户表和兴趣表,兴趣表中的行数是finiate,我正在尝试模拟senario,每个用户都有一组兴趣,这是我的代码:
@Entity
@Table(name="user")
public class User extends Model{
@OneToMany(cascade = CascadeType.PERSIST)
@JoinTable(name="user_interest")
public List<Interest> interests;
}
@Entity
@Table(name="interest")
public class Interest extends Model{
@Id
public Long id;
public String name;
public String image;
}
Run Code Online (Sandbox Code Playgroud)
我自然希望有联合表但是进化忽略了创建连接表并尝试通过在兴趣表中添加额外的列来实现.这是
create table interest (
19 id bigint auto_increment not null,
20 user_id bigint not null,
21 name varchar(255),
22 image varchar(255),
23 constraint pk_interest primary key (id))
.
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么??如何使用ebean在play2.2中创建一个简单的OneToMany关系WITH join表?
感谢致敬
我尝试在Postgres中运行此语句:
insert into field (id, name) values (DEFAULT, 'Me')
Run Code Online (Sandbox Code Playgroud)
我收到了这个错误:
ERROR: null value in column "id" violates not-null constraint
Run Code Online (Sandbox Code Playgroud)
我最终不得不手动设置ID.问题是当我的应用程序插入记录时,我收到重复的密钥错误.我正在使用Play框架和ebean ORM构建一个Java应用程序.因此整个模式由ebean自动生成.在这种情况下,手动将记录插入我的数据库的最佳做法是什么?
编辑:
这是我创建Field类的方法
@Entity
public class Field {
@id
public Long id;
public String name;
}
Run Code Online (Sandbox Code Playgroud)
编辑:
我检查了field_seq序列,它看起来像这样:
CREATE SEQUENCE public.field_seq INCREMENT BY 1 MINVALUE 1 MAXVALUE 9223372036854775807 START 1 CACHE 1;
Run Code Online (Sandbox Code Playgroud)
编辑:
这是pgAdmin III中生成的SQL:
CREATE TABLE field
(
id bigint NOT NULL,
created timestamp without time zone,
modified timestamp without time zone,
name character varying(255),
enabled boolean,
auto_set boolean, …Run Code Online (Sandbox Code Playgroud) 我试图在MySQL兼容模式下使用H2数据库在Play 2应用程序中运行单元测试.我配置@Before如下:
@Before
public void startApp() throws Exception {
Map<String, String> settings = new HashMap<String, String>();
settings.put("db.default.driver", "org.h2.Driver");
settings.put("db.default.user", "sa");
settings.put("db.default.password", "");
settings.put("db.default.url", "jdbc:h2:mem:play-test-351881363;MODE=MySQL"); // TODO: use config for url
settings.put("db.default.jndiName", "DefaultDS");
app = Helpers.fakeApplication(settings);
Helpers.start(app);
databaseTester = new JndiDatabaseTester("DefaultDS");
IDataSet expectedDataSet = new FlatXmlDataSetBuilder().build(play.Play.application()
.resourceAsStream("/resources/dataset.xml"));
databaseTester.setDataSet(expectedDataSet);
databaseTester.onSetup();
}
@After
public void stopApp() throws Exception {
databaseTester.onTearDown();
Helpers.stop(app);
}
Run Code Online (Sandbox Code Playgroud)
但它在java.lang.RuntimeException: DataSource user is null?尝试访问数据库时导致实际测试方法:
[ERROR] [02/12/2013 01:19:32.085] [application-akka.actor.default-dispatcher-4] [akka://application/user/load_data_task_runner_test/load_record] DataSource user is null?
java.lang.RuntimeException: DataSource user …Run Code Online (Sandbox Code Playgroud) 为了获得最佳性能和验证便利性,String字段需要哪些注释?
数据库:MySQL
存储地区名称的字段
@Column(length=50) // javax.persistence.Column
Run Code Online (Sandbox Code Playgroud)
这会被转换为varchar(50)吗?或者我特别需要这个:
@Column(columnDefinition='varchar(50)')
Run Code Online (Sandbox Code Playgroud)
还有另外两个注释
@MaxLength(50) // play.data.validation.Constraints.MaxLength
@Length(max=50) // com.avaje.ebean.validation.Length, is this one useful or not required anyway?
public String districtName;
Run Code Online (Sandbox Code Playgroud)
我想我需要@Column(长度= 50)进行定义,并且@MaxLength(50)需要同时进行验证?或者这两个中的一个会自动暗示另一个?
谢谢.
当我试图在Controller方法结果中返回JSON时,我在Ebean模型中正确格式化日期字段时遇到问题
ok(Json.toJson(userObj));
Run Code Online (Sandbox Code Playgroud)
我的代码示例:
@Entity
@Table(name = "user")
public class User extends Model {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "user_id_seq")
public Integer id;
@Formats.DateTime(pattern = "yyyy-MM-dd hh:mm:ss")
public Date last_login;
...
}
Run Code Online (Sandbox Code Playgroud)
表位于postgresql数据库中 - 字段last_login是时间戳.
Json的结果是:
{"id":202,"last_login":1386775797494,...}
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下如何让它发挥作用吗?
最好的问候,卢卡斯
我在Play 2.0中开发了一个Java应用程序,现在我正在尝试将其部署到AWS.我首先尝试以与在本地计算机上相同的方式运行它.我将播放源复制到虚拟EC2服务器(Ubuntu 12.04),导出播放到类路径,并复制我的项目.当我运行play compile时,我收到以下错误
[info] Loading project definition from /home/ubuntu/play-2.0/samples/java/test-crud/project
[info] Set current project to computer-database (in build file:/home/ubuntu/play-2.0/samples/java/test-crud/)
[info] Updating {file:/home/ubuntu/play-2.0/samples/java/test-crud/}computer-database...
[info] Done updating.
[info] Compiling 21 Scala sources and 16 Java sources to /home/ubuntu/play-2.0/samples /java/test-crud/target/scala-2.9.1/classes...
[error] /home/ubuntu/play-2.0/samples/java/test-crud/app/models/Dealership.java:32: not found: type Finder
[error] public static Finder<Long,Dealership> find = new Finder<Long,Dealership>(Long.class, Dealership.class);
[error] ^
[error] one error found
[error] {file:/home/ubuntu/play-2.0/samples/java/test-crud/}computer-database/compile:compile: Compilation failed
[error] Total time: 117 s, completed Apr 21, 2014 3:48:33 AM
Run Code Online (Sandbox Code Playgroud)
该应用程序基于Ebean的CRUD示例构建.当我尝试在Play中编译该示例应用程序时,我没有任何麻烦.为什么编译器与Finder有问题?
我正在使用ebean运行一些问题(使用play framework 2 version 2.2.1)我有两个类:
我的图类:
public class Graph extends Model {
@Id
@Column(name="id")
private String id;
@Column(name="type")
private String type;
@OneToMany(mappedBy="valGraph", cascade=CascadeType.ALL)
private List<Val> valItems;
Run Code Online (Sandbox Code Playgroud)
和我的值类(使用Val.graphId外键Graph.id):
public class Val extends Model
@Id
@Column(name="valId")
private String valId;
@Id
@Column(name="graphId")
private String graphId;
@Column(name="Key")
private String Key;
@Column(name="Value")
private String Value;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="graphId")
private Graph valGraph;
Run Code Online (Sandbox Code Playgroud)
但在尝试保存新项目时,我收到此错误:
javax.persistence.PersistenceException:ERROR执行DML bindLog []错误[列'graphId'指定两次]
我正在使用Play框架,我正在尝试从我的scala代码访问Ebean实体的属性(定义为公共字段并由Play框架增强).
从游戏文档中我了解到了这一点
(2)直接Ebean字段访问(启用延迟加载)的增强仅适用于Java类,而不适用于Scala.因此,Scala源文件(包括标准Play模板)的直接字段访问不会调用延迟加载,通常会导致空(未填充)实体字段.要确保填充字段,可以(a)手动创建getter/setter并改为调用它们,或者(b)确保在访问字段之前完全填充实体.
那我该如何做(b)?我可以在调用scala之前从我的Java访问属性但是有更好/更简单的方法吗?
我是Ebean世界的新手,我在实体之间设置一些关系遇到了一些困难.
我基本上有两个班,User而且Car.
一个用户可以有几辆车(我猜OneToMany),一辆车可以属于一个用户(所以我猜OneToOne).
我如何链接这两个实体?这是我到目前为止所做的
用户
@Entity
public class User extends Model{
@Id
@GeneratedValue
public int id;
public String name;
@ManyToMany(cascade=CascadeType.ALL)
public List<Car> car = new ArrayList<Car>();
}
Run Code Online (Sandbox Code Playgroud)
汽车
@Entity
public class Car extends Model{
@Id
@GeneratedValue
public int id;
@OneToOne(cascade = CascadeType.ALL)
public User user;
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误
PersistenceException:models.User.car上的错误在[models.Car]中找不到mappedBy属性[users]
有人可以清楚地向我解释如何以正确的方式使用注释(非常糟糕的文档),并告诉我为什么会出现此错误?
java playframework ebean playframework-2.2 playframework-2.3
这是我的plugins.sbt
addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.6.9")
addSbtPlugin("com.typesafe.sbt" % "sbt-play-enhancer" % "1.2.2")
addSbtPlugin("com.typesafe.sbt" % "sbt-play-ebean" % "3.0.0")
Run Code Online (Sandbox Code Playgroud)
和build.sbt
name := """play-java-starter-example"""
version := "1.0-SNAPSHOT"
lazy val root = (project in file(".")).enablePlugins(PlayJava, PlayEbean)
scalaVersion := "2.12.2"
libraryDependencies ++= Seq(
javaJdbc,
cache,
javaWs,
javaEbean,
evolutions
)
libraryDependencies += guice
// Test Database
libraryDependencies += "com.h2database" % "h2" % "1.4.194"
// Testing libraries for dealing with CompletionStage...
libraryDependencies += "org.assertj" % "assertj-core" % "3.6.2" % Test
libraryDependencies += "org.awaitility" % "awaitility" % …Run Code Online (Sandbox Code Playgroud) ebean ×10
java ×6
one-to-many ×2
scala ×2
annotations ×1
h2 ×1
insert ×1
jpa ×1
json ×1
many-to-one ×1
postgresql ×1
sbt ×1
unit-testing ×1