Я пытаюсь использовать Hibernate для хранения двух объектов: пользователей (у которых есть ID, имя и ImageURL) и игроков (у которых есть пользователь, очки и FriendIDList).
По какой-то причине hibernateправильно хранит Users и говорит, что выполняет INSERT в PLAYER, но когда я пытаюсь получить Player, я только что сохранил (или любого игрока), коллекция всегда пуста.Пользователи возвращаются правильно.Попробовал em.flush (), который не помог, и попытался создать новый проигрыватель с конструктором по умолчанию и выполнить em.persist для этого, но получил те же результаты.
Пожалуйста, помогите.Я действительно не могу понять, что здесь не так.Это должно быть довольно просто.
Вот мой код WebService для POST для игроков
@Path("/webService")
@RequestScoped
@Consumes({ "application/json" })
@Produces({ "application/json" })
public class MyWebService {
@PersistenceContext(type = PersistenceContextType.EXTENDED)
private EntityManager em;
@POST
@Path("/PlayerRequest/{id}/{name}/{imageURL}")
@Consumes("application/json")
public Player playerPOSTRequest(
@PathParam("id") long id,
@PathParam("name") String name,
@PathParam("imageURL") String imageURL,
ArrayList<String> JsonInput) {
System.out.println("POST on a PlayerRequest for Player id: ["+ id + "]");
User foundUser = null;
foundUser = getUserByid(em, id);
if(null == foundUser){
User user = new User(id, name, imageURL);
em.persist(user);
foundUser = user;
}
Player foundPlayer = null;
foundPlayer = getPlayerByid(em, id);
if (null == foundPlayer) {
Player player = new Player(foundUser);
em.persist(player);
em.flush(); //Try Flushing to see if that helps
foundPlayer = player;
Player newPlayer = new Player(); //See if default constructor is any different
em.persist(newPlayer); //Try default constructor just to see
} else {
// RETURNING PLAYER
System.out.println("Welcome back. You are a current player.");
}
//Use JsonInput for stuff here
System.out.println("Returning Player: " + foundPlayer);
return foundPlayer;
}// playerPOSTRequest
}//myWebService
Вот мой класс Player (за исключением get / setters)
@XmlRootElement
@Entity
@Table(name = "PLAYER")
public class Player implements java.io.Serializable {
private static final long serialVersionUID = 1L;
@Id
private @GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id", updatable = false, nullable = false)
Long id = null;
@Version
private @Column(name = "version")
int version = 0;
public Player(){
}
public Player(User user) {
this.PlayerInfo = user;
this.Points = 100; //New users get 100 points to start with
this.FriendList = new ArrayList<Long>();
}
@OneToOne
@JoinColumn(name="id")
private User PlayerInfo;
@Column
private long Points;
@Column
private ArrayList<Long> FriendList;
@Override
public String toString() {
return "Player [PlayerInfo_FBID=" + PlayerInfo.getFacebookID() + ", PlayerInfo_Name=" + PlayerInfo.getName() + "Points=" + Points + "]";
}
}
Вот мой пользовательский класс без get / setters:
@XmlRootElement
@Entity
@Table(name = "USER")
public class User implements java.io.Serializable {
private static final long serialVersionUID = 1L;
@Id
private @GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id", updatable = false, nullable = false)
Long id = null;
@Version
private @Column(name = "version")
int version = 0;
public User(){
}
public User(long id, String name, String imageURL){
this.id = id;
this.Name = name;
this.ImageURL = imageURL;
}
@Column(name = "myId", unique = true)
private long myId;
@Column
private String Name;
@Column
private String ImageURL;
@Override
public String toString() {
return "User [id=" + myId + ", Name=" + Name + "ImageURL=" + ImageURL + "]";
}
}
Когда я пробегу через это, вот вывод, который я получаю в консоли, обратите внимание на два оператора INSER в PLAYER, которые выполняет Hibernateдля конструктора игрока по умолчанию), но при получении я могу получить пользователя, но нет существующих игроков:
POST on a PlayerRequest for Player ID: [36985]
Hibernate:
select
user0_.id as id12_,
user0_.myID as myID12_,
user0_.ImageURL as ImageURL12_,
user0_.Name as Name12_,
user0_.version as version12_
from
USER user0_
where
user0_.myID=?
New User for PlayerInfo for Player request. Adding User to the system.
Hibernate:
call next value for hibernate_sequence
Hibernate:
insert
into
USER
(myID, ImageURL, Name, version, id)
values
(?, ?, ?, ?, ?)
Hibernate:
select
player0_.id as id13_,
player0_.FriendList as FriendList13_,
player0_.Points as Points13_,
player0_.version as version13_
from
PLAYER player0_ cross
join
USER user1_
where
player0_.id=user1_.id
and user1_.myID=?
New Player request. Adding Player to the system.
Hibernate:
call next value for hibernate_sequence
Hibernate:
insert
into
PLAYER
(FriendList, Points, version, id)
values
(?, ?, ?, ?)
Hibernate:
call next value for hibernate_sequence
Hibernate:
insert
into
PLAYER
(FriendList, Points, version, id)
values
(?, ?, ?, ?)
Returning Player: Player [PlayerInfo_ID=36985, PlayerInfo_Name=Joe Smith Points=100]
GET on specific Player for User ID: [36985]
Hibernate:
select
player0_.id as id13_,
player0_.FriendList as FriendList13_,
player0_.Points as Points13_,
player0_.version as version13_
from
PLAYER player0_ cross
join
USER user1_
where
player0_.id=user1_.id
and user1_.myID=?
Returning Player: null
GET on All Players
Hibernate:
select
player0_.id as id13_,
player0_.FriendList as FriendList13_,
player0_.Points as Points13_,
player0_.version as version13_
from
PLAYER player0_ cross
join
USER user1_
where
player0_.id=user1_.id
and user1_.myID>?
Returning List: []
GET on specific User for User ID: [36985]
Hibernate:
select
user0_.id as id12_,
user0_.myID as myID12_,
user0_.ImageURL as ImageURL12_,
user0_.Name as Name12_,
user0_.version as version12_
from
USER user0_
where
user0_.myID=?
Returning User: User [ID=36985, Name=Bob Smith ImageURL=www.myImage.com]