I'm studding play framework trying make a api using play java, I did insert, delete, update.
When I was making login system with sessions, I face a doubt about relationship between two models.
I search for 2 day on the web and I didn't able to understand how can I do it.
I'm using ebean, entity model, and try it:
My controller:
package controllers;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import models.AdministratorSessions;
import models.Administrators;
import play.libs.Json;
import play.mvc.*;
import java.util.List;
import static play.libs.Json.toJson;
public class Administrator extends Controller {
    public static Result login(){
        JsonNode json               = request().body().asJson();
        if(json != null){
            String email    = json.findPath("email").asText();
            String password = json.findPath("password").asText();
            AdministratorSessions admSession = Administrators.loginAdm(email, password);
            if(admSession != null) {
                ObjectNode result = Json.newObject();
                result.put("status", "OK");
                result.put("dara", Json.toJson(admSession));
                return ok(toJson(result));
            }else{
                return badRequest("Error loggin administrator");
            }
        }else{
            return badRequest("Expecting Json data");
        }
    }
}
My Administrator Model:
package models;
import javax.persistence.*;
import play.db.ebean.*;
import utils.HashString;
import java.util.*;
/**
 * Created by sidnei on 6/12/14.
 */
@Entity
public class Administrators extends Model {
    @Id
    @Column(name="administrator_id", nullable=false, length=32)
    public String id;
    @Column(name="administrator_email", nullable=false, length=255)
    public String email;
    @Column(name="administrator_name", nullable=false, length=255)
    public String name;
    @Column(name="administrator_password", nullable=false, length=32)
    public String password;
    @Column(name="administrator_date", nullable=false)
    public Date admDate;
    @Column(name="administrator_active", nullable=false)
    public Boolean active;
    @OneToMany(cascade = CascadeType.PERSIST, mappedBy = "administrators")
    public List<AdministratorSessions> administrator_sessions;
    public static Finder<String, Administrators> find = new Finder(Long.class, Administrators.class);
    public Administrators(String _name, String _email, String _password) {
        this.name       = _name;
        this.email      = _email;
        this.password   = HashString.makeHash(_password);
        this.admDate    = new Date();
        this.active     = true;
        this.id         = HashString.makeHash(_name + _email + password + "locationProjectSecret");
    }
    public static Administrators createAdm(String _name, String _email, String _password){
        try {
            Administrators adm = new Administrators(_name, _email, _password);
            adm.save();
            return adm;
        }catch (Exception e){
            return null;
        }
    }
    public static AdministratorSessions loginAdm(String _email, String _password){
        try {
            Map<String, Object> params = new HashMap<String, Object>();
            params.put("email", _email);
            params.put("password", HashString.makeHash(_password));
            Administrators adm = Administrators.find.where().allEq(params).findUnique();
            if (adm != null){
                AdministratorSessions admSession = AdministratorSessions.create(adm.id);
                return admSession;
            }else{
                return null;
            }
        }catch (Exception e){
            return null;
        }
    }
}
My administrator session model:
package models;
import play.Logger;
import play.db.ebean.Model;
import utils.HashString;
import javax.persistence.*;
import java.util.Date;
/**
 * Created by sidnei on 6/12/14.
 */
@Entity
public class AdministratorSessions extends Model {
    @Id
    @Column(name="administrator_session_key", nullable=false, length=32)
    public String id;
    @Column(name="administrator_session_date", nullable=false)
    public Date sessionDate;
    @Column(name="administrator_session_active", nullable=false)
    public Boolean active;
    @ManyToOne
    @JoinColumn(name = "administrator_id")
    public Administrators administrators;
    public static Finder<String, AdministratorSessions> find = new Finder(Long.class, AdministratorSessions.class);
    public AdministratorSessions(String _adminId) {
//        this.administrator_id   = _adminId;
        this.sessionDate        = new Date();
        this.id                 = HashString.makeHash(_adminId + this.sessionDate.toString() + "locationProjectSecretForSession" + Math.random());
        this.active             = true;
    }
    public static AdministratorSessions create(String _adminId){
        try{
            AdministratorSessions admSessions = new AdministratorSessions(_adminId);
            admSessions.save();
            return admSessions;
        }catch (Exception e){
            Logger.info("aqui");
            Logger.debug(e.getMessage());
            return  null;
        }
    }
}
But when I save my table "administrator_sessions" is like this:
 session_key | session_date | session_active | administrator_id
-------------+--------------+----------------+-----------------
 f1d4c3296d1 | 2014-06-17   | t              |
(it's an example).
So, administrator_id never fill with the administrator id from administrators model.
How can I do that and what is the best practice to do this api?
If someone have an example or explain how it works I'll glade soo much!
Thanks
=========== Edited solved
Hi,
I solved the problem, first, obviously, I would need pass the object administrator and not the id of the administrator.
Then I got a problem with to json serialize (RuntimeException: java.lang.IllegalArgumentException: Infinite recursion).
With this topic: Infinite Recursion with Jackson JSON and Hibernate JPA issue I solved my problem, so, my classes is now like this:
Administrator model:
package models;
import javax.persistence.*;
import com.fasterxml.jackson.annotation.JsonManagedReference;
import play.Logger;
import play.db.ebean.*;
import utils.HashString;
import java.util.*;
/**
 * Created by sidnei on 6/12/14.
 */
@Entity
public class Administrators extends Model {
    @Id
    @Column(name="administrator_id", nullable=false, length=32)
    public String id;
    @Column(name="administrator_email", nullable=false, length=255)
    public String email;
    @Column(name="administrator_name", nullable=false, length=255)
    public String name;
    @Column(name="administrator_password", nullable=false, length=32)
    public String password;
    @Column(name="administrator_date", nullable=false)
    public Date admDate;
    @Column(name="administrator_active", nullable=false)
    public Boolean active;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "administrators")
    @Column(nullable = true)
    @JsonManagedReference
    public Set<AdministratorSessions> administrator_sessions;
    public static Finder<String, Administrators> find = new Finder(Long.class, Administrators.class);
    public static AdministratorSessions loginAdm(String _email, String _password){
        try {
            Map<String, Object> params = new HashMap<String, Object>();
            params.put("email", _email);
            params.put("password", HashString.makeHash(_password));
            Administrators adm = Administrators.find.where().allEq(params).findUnique();
            if (adm != null){
                AdministratorSessions admSession = AdministratorSessions.create(adm);
                return admSession;
            }else{
                return null;
            }
        }catch (Exception e){
            return null;
        }
    }
}
Administrator session model:
package models;
import com.fasterxml.jackson.annotation.JsonBackReference;
import play.Logger;
import play.db.ebean.Model;
import utils.HashString;
import javax.persistence.*;
import java.util.Date;
/**
 * Created by sidnei on 6/12/14.
 */
@Entity
public class AdministratorSessions extends Model {
    @Id
    @Column(name="administrator_session_key", nullable=false, length=32)
    public String key;
    @Column(name="administrator_session_date", nullable=false)
    public Date sessionDate;
    @Column(name="administrator_session_active", nullable=false)
    public Boolean active;
    @ManyToOne
    @JoinColumn(name = "administrator_id")
    @JsonBackReference
    public Administrators administrators;
    public static Finder<String, AdministratorSessions> find = new Finder(Long.class, AdministratorSessions.class);
    public AdministratorSessions(Administrators _adm) {
        this.administrators     = _adm;
        this.sessionDate        = new Date();
        this.key                = HashString.makeHash(_adm.id + this.sessionDate.toString() + "locationProjectSecretForSession" + Math.random());
        this.active             = true;
    }
    public static AdministratorSessions create(Administrators _adm){
        try{
            AdministratorSessions admSessions = new AdministratorSessions(_adm);
            admSessions.save();
            return admSessions;
        }catch (Exception e){
            Logger.info("aqui");
            Logger.debug(e.getMessage());
            return  null;
        }
    }
}
It's working perfectly now, thanks
 
    