Hibernate вызывает INSERT на POST, но некоторые данные отсутствуют, когда я получаю - PullRequest
0 голосов
/ 30 сентября 2011

Я пытаюсь использовать 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]

1 Ответ

0 голосов
/ 30 сентября 2011

Кажется, проблема в аннотациях отображения игрока.

@OneToOne
@JoinColumn(name="id")

Имя, присвоенное JoinColumn, совпадает с идентификатором (PK).Таким образом, Hibernate генерирует неправильный SQL-запрос, делая неправильное соединение между двумя таблицами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...