Множественная взаимосвязь при воспроизведении с siena

#java #google-app-engine #playframework #siena

#java #google-app-engine #playframework #siena

Вопрос:

Я создаю объект с двумя отношениями «один ко многим». Событие имеет пользовательское поле и поле места. Я пытаюсь использовать автоматический запрос, но этот код всегда возвращает пустой список.

     User user = new User("mauriziopz@gmail.com","Maurizio Pozzobon","01","hash","facebook");
    user.insert();
    Place place = new Place("posto","bel posto",null,null);
    place.insert();
    Event e =new Event(user,place, "Festa","Questa è una gran bella festa",null,new Date(),(long) 10,false,null);
    e.insert();
    List<Event> l =user.events.fetch();
  

Класс Event является

 public class Event extends Model{
    @Id
    public Long id;

    ...

    //Relazioni
    public User user;
    public Place place;

        ...

    public Event(User user, Place place,String nome, String descrizione, String uRLImmagine, Date dataInizio, Long durata, Boolean isRicorrente, Long ricorrenza) {
        this.user=user;
        this.place=place;
        ...
    }
        ...
}
  

Если я изменю класс события следующим образом

 public class Event extends Model{
    @Id
    public Long id;

    ...

    //Relazioni
    public User user;
    //public Place place;

        ...

    public Event(User user, Place place,String nome, String descrizione, String uRLImmagine, Date dataInizio, Long durata, Boolean isRicorrente, Long ricorrenza) {
        this.user=user;
        //this.place=place;
        ...
    }
        ...
}
  

Тот же код, что и выше, возвращает список с одним событием в нем (то, что я ожидал)

Редактировать: Это класс Place

 public class Place extends Model {



@Id
public Long id;

public String nome;
public String descrizione;
public String uRLImmagine;
public String indirizzo;


//Relazioni
// public User user;
//@Filter("place")
//public Query<Event> events;
private Set<Long> idEvents = new HashSet<Long>();
private Set<Long> idPlaceVotes = new HashSet<Long>();
private Set<Long> idPlaceComments = new HashSet<Long>();


public Place(/*User user,*/ String nome, String descrizione, String uRLImmagine,String indirizzo) {
//  this.user=user;
    this.nome = nome;
    this.descrizione = descrizione;
    this.uRLImmagine = uRLImmagine;
    this.indirizzo = indirizzo;
}


static Query<Place> all() {
    return Model.all(Place.class);
}

public static Place findById(Long id) {
    return all().filter("id", id).get();
}

public String toString() {
    return nome;
}  

public static void delete(Long id) {
    findById(id).delete();

}

}
  

Это пользовательский класс

 public class User extends Model {

@Id
public Long id;

public String nome;
public String email;
public String webId;    //ID of the user in the provider website
public String passwordHash;
public String service;

//Relazioni
@Filter("user")
public Query<Event> events;

public User(String email, String name,String webId, String passwordHash, String service) throws Exception {
    if (email!=null)
        this.email=email;
    else
        throw new Exception("An email is required");
    if (name!=null)
        this.nome=name;
    else
        throw new Exception("A name is required");

    if (webId!=null)
        this.webId=webId;
    else
        throw new Exception("A webId is required");

    this.passwordHash=passwordHash;
    this.service = service;
}

public void setEmail(String email) throws Exception{
    if (email!=null)
        this.email=email;
    else
        throw new Exception("An email is needed");
}

static Query<User> all() {
    return Model.all(User.class);
}

public static User findById(Long id) {
    return all().filter("id", id).get();
}

public static User findByEmail(String email){
    return all().filter("email", email).get();
}

public String toString() {
    return nome;
}

}
  

Моя модель была суперклассом siena.Модель, но я точно знаю, что она не делает ничего полезного, поэтому я изменил ее обратно на Model.
Я использую play-siena 1.5 в play 1.1

Комментарии:

1. можете ли вы дать мне свой пользовательский код, чтобы я мог попробовать это? Что еще за класс MyModel?

Ответ №1:

Я нашел вашу проблему 🙂

Это известная проблема, но я забываю об этом каждый раз.
В вашем событии просто объявите @Column:

 public class Event extends Model{
    @Id
    public Long id;

    @Column("user")
    public User user;

    @Column("place")
    public Place place;
}
  

Поскольку у пользователя и места есть ключевое поле с именем «id», а имя ключевого поля используется Siena по умолчанию при отсутствии столбца @, возникает коллизия, когда GAE пытается найти объект по полю «id».
Я постараюсь исправить это в Siena v1.0.0 (и вы уже можете использовать siena.jar генерируется из версии v1.0.0 (прозрачно в игре)

с уважением, Pascal

Комментарии:

1. Спасибо! Это работает. Вероятно, вам следует удалить эту строку «Любая другая аннотация, кроме @Id, игнорируется». из документов GAE sienaproject.com/documentation-gae.html Еще раз спасибо

2. Я собираюсь полностью переработать документ, потому что в новой входящей версии 1.0.0 изменилось так много вещей, что я предпочитаю начинать с нуля. Но не волнуйтесь, если вы работаете с более старой версией, обратная совместимость была протестирована довольно часто 😉