2014-11-05 77 views
1

表:外键约束使用ebean中发挥

  1. Attributes:电影属性(剧情,惊悚等)(有列:ID,姓名)
  2. User:用户在系统中(有列:ID ,名称)
  3. Movie:有属性相关联(如'矩阵'具有'科幻-60%','惊悚片-40%'等)(具有列:id,attrid,fraction) - attrid是一个外键到Attributes
  4. Preference:用户对电影的偏好(具有列:id,uid,movieid,rating) - uid是外键,Usermovieid是外键Movie

这是模型描述我到目前为止:

User: 

    @Entity 
    @Table(name="USER") 
    public class User extends Model { 
    @Id 
    @Column(name = "uid") 
    public Long uid; 

    @Column(name = "name") 
    public String name; 
    } 

    Movie Attribute: 

    @Entity 
    @Table(name = "MOVIEATTRIBUTE") 
    public class Attribute extends Model { 
    @Id 
    @Column(name = "attrid") 
    public Long attrid; 

    @Column(name = "name") 
    public String name; 

    @ManyToMany 
    @JoinColumn(name = "movieid") 
    public Movie movie; 
    } 

    Movie: 

    @Entity 
    public class Movie extends Model { 
    @Id 
    @Column(name = "movieid") 
    public Long movieid; 

    @ManyToMany 
    @JoinColumn(name = "attrid") 
    public Attribute attribute; 

    @Column(name = "rating") 
    public Integer rating; 
    } 

    Preference: 

    @Entity 
    public class Preference extends Model { 
    @Id 
    @Column(name = "prefid") 
    public Long prefid; 

    @ManyToMany 
    @JoinColumn(name="uid") 
    public User user; 

    @ManyToMany 
    @JoinColumn(name="movieid") 
    private Movie movie; 

    @Column(name = "rating") 
    public Integer rating; 
    } 

我得到以下运行时异常:无法读取偏好注解。

我错过了什么?

谢谢!

回答

0

你有这个代码所做的几个错误:

  1. 使用不当@ManyToMany注解。您将它添加到Movie类中的'电影电影'字段和'电影类'中的'属性属性'字段中。 因此,您只能将一个属性分配给电影对象,并且只能将一个电影分配给属性。但注释说,单个电影可以有很多属性,而许多电影属性。 如果您使用@ManyToMany或@OneToMany注释,那么您应该使用集合。所以在这里适当的关系应该是:

    在电影类:

    @OneToMany(的mappedBy = “电影”) 公共属性列表;

在属性类:

@ManyToOne 
public Movie movie; 
  • 当你定义两个模型类(你把两个类注解),应使用 '的mappedBy' 之间的双向关系属性中的一个。 该属性表示第二类中的字段,它是此关系的第二个结尾。
  • 你到处都用@ManyToMany关系。但根据你的描述,我推断你不需要这种关系。您需要两个双向@ManyToOne关系和一个单向@OneToOne关系。
  • 您的电影类没有“标题”属性
  • 您不必指定表和列的名称。如果你省略这些,它们将与类和字段名称相同。

    我在你的代码做了一些修正,使其工作:

  • 用户等级:

    @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; 
    } 
    

    Preferences类:

    @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); 
    }