Play 2.2.2 ArrayLists在尝试访问时返回null

时间:2014-04-05 18:44:08

标签: java arraylist ebean

我安装了play-2.2.2但是在尝试访问ArrayList时遇到了一些Ebean @OneToMany关系的问题。

我基本上有一个User类,它包含一个Address类的ArrayList。代码如下:

@Entity
@Inheritance(strategy= InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="TYPE", discriminatorType = DiscriminatorType.STRING)
public class User extends Model{

    @Id
    private Long id;
    @OneToMany(cascade=CascadeType.ALL)
    private ArrayList<Address> addressList = new ArrayList<Address>();

    ...

    public void addAdress(Address address){
        this.addressList.add(address);
    }

班级地址

@Entity
public class Address extends Model {

    @Id
    private Long id;
    @ManyToOne
    private User user;

    ...

现在假设我创建了一个新用户和一个新地址。我想将地址添加到新用户的ArrayList,然后保存它们。有点像这样:

User newUser = new User();
Address newAddress = new Address();
newUser.addAddress(newAddress);
newUser.save();

此代码的问题是地址未保存。不应该保存,因为我将CascadeType指定为all?

另一个问题是,大多数时候,我的用户将在地址之前创建。所以我要说我已经有了一个用户。现在我要做的是为现有用户添加一个新地址:

User user = User.getCurrentUser();
user.addAddress(new Address());
user.save();

此代码给出了一个错误,在方法addAddress中声明了NullPointerException。它基本上说我的addressList为null。这是为什么?我只是想不出来。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

这应该只是因为您的JPA注释未正确分配。

您应该通过添加查找信息告诉ebean如何获​​取地址,否则它不知道如何执行此操作:

@OneToMany(cascade=CascadeType.ALL, mappedBy = "id") // id is the field name in Address
private Set<Address> addressList;

你也应该按建议使用Set:http://www.avaje.org/manydatatypes.html

更喜欢set的原因并不在我的脑海中,但我记得当你进行多次获取连接时,列表可能会导致问题。

并在您的地址类中:

@ManyToOne
@JoinColumn(name = "(the id column name in user table)")
private User user;