如何在Play中保存ArrayList?

时间:2013-05-26 00:13:57

标签: java arraylist playframework-2.0 ebean

这可能看起来像一个非常基本的问题,但我有一个模型(用户),我想存储一个字符串的ArrayList(他们是其他用户的id)。我像这样声明List:

 public List<String> friends = new ArrayList<String>();

在我向数组添加条目后,我保存了用户。但是当我尝试使用它时,朋友总是空的。有没有特定的方法来保存ArrayList?任何帮助将不胜感激。

我的模特:

@Entity
public class User extends Model {

@Id
public String username;
public String password;

public List<String> friends = new ArrayList<String>();

public static Finder<String, User> find = new Finder<String, User>(String.class, User.class);

// Constructor
public User(String username, String password){
    this.username = username;
    this.password = password;
}

// Methods
public void addFriend(String friend){
    friends.add(friend);
}

// Static Methods
public static User authenticate(String username, String password){
    return find.where().eq("username", username).eq("password", password).findUnique();
}

public static void befriend(String user1, String user2){
    User.find.ref(user1).addFriend(user2));
    User.find.ref(user2).addFriend(user1);

    User.find.ref(user1).save();
    User.find.ref(user2).save();
}

}

控制器方法:

return ok(index.render(
        User.find.byId(request().username()).friends,
));

一个非常简单的观点:

@(friends: List[User])

<div id="current_friends">
    @for(friend <- friends) {
        @friend.username
    }
</div>

3 个答案:

答案 0 :(得分:1)

您需要使用saveManyToManyAssociations(String fieldname)“手动”保存关系,例如:

public static void befriend(String userName1, String userName2){

    User user1 = User.find.byId(userName1);
    User user2 = User.find.byId(userName2);

    user1.friends.add(user2);
    user2.friends.add(user1);

    user1.save();
    user2.save();

    // here...
    user1.saveManyToManyAssociations("friends");
    user2.saveManyToManyAssociations("friends");

}

(注意:从我自己的顶部开始编写,请自行调试)

答案 1 :(得分:0)

出现此问题的一个可能原因可能是您的观点:

您视图的第一行是

@(friends: List[User])

用户没有包名,这可能导致空指针异常。 就我而言,我的User bean在模型包下,所以我有以下几行:

@(friends: List[models.User])

答案 2 :(得分:0)

我遇到了完全相同的问题,这就是我修复它的方法(稍作解释)。

实际上,您尝试在DataBase中保存ArrayList(因此大小未定义)。而且显然(并且相当逻辑),Play Framework并不是真的喜欢它;你必须使用注释或瞬态类。我决定使用课堂方式(也因为我不知道如何使用注释来制作子表,所以我没有承担风险,但这不是最好的方式事实上,这是一种可怕的做法。但是,它仍然存在。)

在你的情况下,你可以这样:

@Entity
public class Friends extends Model {
    @Id
    public Long id;
    @Required
    public String user1;
    @Required
    public String user2;

    public static Finder<Long, Friends> find = new Finder<Long, Friends>(Long.class, Friends.class);

    //Here put your functions, I myself only added an insert method for the moment :

    public static void add(String user1, String user2){
        Friends f = new Friends();
        f.user1 = user1;
        f.user2 = user2;
        bu.save();
    }
}

在您的用户模型中,只需通过此功能将用户保存到彼此的部分更改为

希望这会有所帮助。

注意:id在这里是因为我喜欢数字ID,随时可以更改它。

注意2:当然,使用@ManyToOne和@OneToMany注释要好得多,但正如我之前所写,我不确切知道它是如何工作的。