表:
Attributes
:电影属性(戏剧,惊悚片等)(有列:id,名称)User
:系统中的用户(具有列:id,名称)Movie
:有关联的属性(比如'矩阵'有'sci-fi - 60%','惊悚片 - 40%'等)(有列:id,attrid,fraction) - {{1} }是attrid
Attributes
:用户对电影的偏好(包含列:id,uid,movieid,评级) - Preference
是uid
的外键,User
是外键进入movieid
。这是我到目前为止的模型描述:
Movie
我收到以下运行时异常:无法读取Preference的注释。
我错过了什么?
谢谢!
答案 0 :(得分:1)
您在此代码中犯了几个错误:
您错误地使用了@ManyToMany注释。你把它添加到了电影电影'属性类中的字段和'属性属性' Movie类中的字段。 因此,您只能为影片对象分配一个属性,并且只能分配一个要归属的影片。但是注释说单个电影和许多电影的属性可以有很多属性。 如果您使用@ManyToMany或@OneToMany注释,那么您应该使用集合。所以这里适当的关系应该是:
在电影课上:
@OneToMany(的mappedBy ="电影&#34) 公共列表属性;
在属性类中:
@ManyToOne
public Movie movie;
您不必指定表和列的名称。如果省略它,它们将与类和字段名称相同。
我在您的代码中进行了一些修正以使其正常工作:
用户类:
@Entity
public class User extends Model {
@Id
public Long id;
public String name;
@OneToMany(mappedBy="user")
public List<Preference> preferences;
}
电影课:
@Entity
public class Movie extends Model {
@Id
public Long id;
@OneToMany(mappedBy="movie")
public List<Attribute> attributes;
public Integer rating;
public String title;
}
属性类:
@Entity
public class Attribute extends Model {
@Id
public Long id;
public String name;
@ManyToOne
public Movie movie;
}
首选项类:
@Entity
public class Preference extends Model {
@Id
public Long id;
@ManyToOne
public User user;
@OneToOne
public Movie movie;
public Integer rating;
}
测试方法:
@Test
public void movieTest () {
FakeApplication app = Helpers.fakeApplication(Helpers.inMemoryDatabase());
Helpers.start(app);
User u = new User();
u.id=1L;
u.name="John";
Movie m = new Movie();
m.id = 1L;
m.title = "Matrix";
m.rating = 5;
Attribute a = new Attribute();
a.id = 1L;
a.name = "Comedy";
a.movie = m;
m.attributes.add(a);
Preference p = new Preference();
p.id = 1L;
p.rating = 10;
p.user=u;
p.movie=m;
Ebean.save(u);
Ebean.save(m);
Ebean.save(a);
Ebean.save(p);
User fu = Ebean.find(User.class, 1L);
Movie fm = Ebean.find(Movie.class, 1L);
Attribute fa = Ebean.find(Attribute.class, 1L);
Preference fp = Ebean.find(Preference.class, 1L);
System.out.println("User: id:"+fu.id+" name:"+fu.name+ " preference_rating:"+fu.preferences.get(0).rating);
System.out.println("Movie: id:" + fm.id+" rating:" + fm.rating + " attrname:"+fm.attributes.get(0).name);
System.out.println("Attribute: id:"+fa.id+" name:"+fa.name);
System.out.println("Preference: id:"+fp.id+" name:"+fp.rating+" username:"+fp.user.name+" movietitle:"+fp.movie.title);
}