Java Hibernate在POST上调用INSERT,但当我得到
我试图使用Hibernate存储两个对象,用户(具有ID、名称和ImageURL)和播放器(具有用户、点和FriendList) 出于某种原因,hibernate正确地存储了用户,并说它正在执行对播放器的插入,但当我试图检索我刚刚保存的播放器(或任何播放器)时,集合总是空的。用户正确返回。尝试了em.flush(),但没有帮助,尝试使用默认构造函数创建一个新的播放器,并对其执行em.persist,但得到了相同的结果 请帮忙。我真的不知道这里出了什么问题。这应该是相当基本的 这是我在玩家上发布的Web服务代码Java Hibernate在POST上调用INSERT,但当我得到,java,web-services,hibernate,Java,Web Services,Hibernate,我试图使用Hibernate存储两个对象,用户(具有ID、名称和ImageURL)和播放器(具有用户、点和FriendList) 出于某种原因,hibernate正确地存储了用户,并说它正在执行对播放器的插入,但当我试图检索我刚刚保存的播放器(或任何播放器)时,集合总是空的。用户正确返回。尝试了em.flush(),但没有帮助,尝试使用默认构造函数创建一个新的播放器,并对其执行em.persist,但得到了相同的结果 请帮忙。我真的不知道这里出了什么问题。这应该是相当基本的 这是我在玩家上发布的
@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
当我运行此过程时,这里是我在控制台中获得的输出,请注意Hibernate正在生成的两个INSER-into-PLAYER语句(一个用于默认构造函数播放器),但在检索中,我能够获得用户,但没有现有的播放器:
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]
问题似乎出在播放器的映射注释中
@OneToOne
@JoinColumn(name="id")
指定给JoinColumn的名称与指定给id(PK)的名称相同。因此,Hibernate生成了错误的sql查询,在两个表之间进行了不正确的连接。Wow。谢谢,从用户处更改了name=“myID”,现在可以使用了。非常感谢!非常好!如果投票对你有用的话,那就投票吧!;)
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]
@OneToOne
@JoinColumn(name="id")