2017-04-13 37 views
0

我試圖創建一個包含幾個網站(例如金字塔或寺廟)的遊戲。我對所有的網站都有同樣的錯誤,所以我只會以a爲例 - Temple。我想要做的是初始化遊戲板,創建新網站並將它們分配給遊戲,反之亦然。在站點設置類遊戲工作正常,但設置父「Game.java」網站拋出以下錯誤:值太長Java列中的X列二進制(255)使用JPA編寫的跳轉列表

2017-04-13 17:23:10.183 WARN 5764 --- [ main] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 22001, SQLState: 22001 2017-04-13 17:23:10.183 ERROR 5764 --- [ main] o.h.engine.jdbc.spi.SqlExceptionHelper : Value too long for column "TEMPLE BINARY(255)": "X'aced00057372002d63682e757a682e6966692e7365616c2e736f707261667331372e656e746974792e73697465732e54656d706c65bfa968665c9a87790200... (2722)"; SQL statement: update game set burial_chamber=?, current_player=?, market=?, name=?, obelisk=?, ownerid=?, pyramid=?, shipyard=?, status=?, temple=? where game_id=? [22001-191] 2017-04-13 17:23:10.185 INFO 5764 --- [ main] o.h.e.j.b.internal.AbstractBatchImpl : HHH000010: On release of batch it still contained JDBC statements

import javax.persistence.*; 
import java.io.Serializable; 
import java.lang.reflect.Array; 
import java.util.ArrayList; 
import java.util.List; 

@Entity 
public class Temple implements Serializable { 

    @Column 
    private boolean isDockEmpty = true; 

    @Id 
    @GeneratedValue 
    @Column(name = "id", updatable = false, nullable = false) 
    private long id; 

    @ElementCollection 
    private List<Color> stones = new ArrayList<Color>(); 

    public List<Color> getStones(){ 
     return stones; 
    } 

    @Column (name = "name") 
    private String name = "Temple"; 

    @OneToOne 
    @JoinColumn (name = "game_id") 
    private Game game; 

    @OneToOne 
    @JoinColumn(name = "SHIP_ID") 
    private Ship ship; 

    public long getId(){ 
     return id; 
    } 

    public void fillDock(){isDockEmpty = false;} 

    public void setId(long id) { 
     this.id = id; 
    } 

    /*public void setStones(List<Stone> stones) { 
     this.stones = stones; 
    }*/ 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public Game getGame() { 
     return game; 
    } 

    public void setGame(Game game) { 
     this.game = game; 
    } 

    public Ship getShip() { 
     return ship; 
    } 

    public void setShip(Ship ship) { 
     this.ship = ship; 
    } 
} 

這裏這個調用(game.setTemple(newTemple)),在BoardService.java類引發錯誤:

private void createAndAssignSites(Game game) { 

     BurialChamber newBurialChamber = new BurialChamber(); 
     Pyramid newPyramid = new Pyramid(); 
     Obelisk newObelisk = new Obelisk(); 
     Temple newTemple = new Temple(); 
     Market newMarket = new Market(); 

     newBurialChamber.setGame(game); 
     newPyramid.setGame(game); 
     newObelisk.setGame(game); 
     newTemple.setGame(game); 
     newMarket.setGame(game); 

//  game.setBurialChamber(newBurialChamber); 
//  game.setPyramid(newPyramid); 
//  game.setObelisk(newObelisk); 
     game.setTemple(newTemple); 
//  game.setMarket(newMarket); 

     gameRepository.save(game); 

     burialChamberRepository.save(newBurialChamber); 
     pyramidRepository.save(newPyramid); 
     obeliskRepository.save(newObelisk); 
     templeRepository.save(newTemple); 
     marketRepository.save(newMarket); 

這裏Game.java類沒有getter和setter和其他瑣碎的方法:

import java.io.Serializable; 
import java.util.ArrayList; 
import java.util.List; 

import javax.persistence.*; 


import ch.uzh.ifi.seal.soprafs17.constant.GameStatus; 
import ch.uzh.ifi.seal.soprafs17.entity.sites.*; 
import com.fasterxml.jackson.annotation.JsonIgnore; 
import org.hibernate.annotations.LazyCollection; 
import org.hibernate.annotations.LazyCollectionOption; 

@Entity (name = "game") 
public class Game implements Serializable { 

    private static final long serialVersionUID = 1L; 

    private List<User> players = new ArrayList<>(); 

    private List<Move> moves = new ArrayList<>(); 

    public Game(){} 

    public Game (String name, long ownerID, User player){ 
     this.name = name; 
     this.ownerID = ownerID; 
     this.status = GameStatus.PENDING; 
     players.add(player); 
    } 

    private Long id; 

    @Id 
    @GeneratedValue 
    @Column (name = "game_id") 
    public Long getId(){ 
     return id; 
    } 

    @Column(nullable = false) 
    private String name; 

    @Column(nullable = false) 
    private Long ownerID; 

    @Column 
    private GameStatus status; 

    @Column 
    private Integer currentPlayer = 0; 

    @OneToMany(mappedBy="game") 
    public List<Move> getMoves(){ 
     return moves; 
    } 

    @JsonIgnore 
    @LazyCollection(LazyCollectionOption.FALSE) 
    @OneToMany (mappedBy="game",cascade = CascadeType.ALL) 
    public List<User> getPlayers(){ 
     return players; 
    } 

    public void setPlayers (List<User> players){ 
     this.players = players; 
    } 

    @OneToOne 
    private BurialChamber burialChamber; 

    @OneToOne 
    private Market market; 

    @OneToOne 
    private Obelisk obelisk; 

    @OneToOne (mappedBy = "game") 
    private Pyramid pyramid; 

    @OneToOne 
    private Shipyard shipyard; 

    @OneToOne (mappedBy = "game") 
    private Temple temple; 

我不明白那個2722字符串是什麼以及它在什麼地方生成的。以及爲什麼這項任務在一個方向上工作,而不是在另一個方向上...... 希望你們可以指點我錯誤的來源。

感謝 阿里克

回答

2

的問題是,你混合兩個字段和方法的註釋。

JPA提供商將通過查找@ID註釋來確定您正在使用的策略,在遊戲情況下該註釋位於該方法上。

@Id 
@GeneratedValue 
@Column (name = "game_id") 
public Long getId(){ 
    return id; 
} 

本質然後寺@OneToOne註釋被忽略,因爲它是在現場:

@OneToOne (mappedBy = "game") 
private Temple temple; 

所以基本上Hibernate試圖再堅持寺作爲遊戲桌一個二進制值,因爲它是不意識到這種關係 - 它只是把它看作一個簡單的領域。

您可以按照下面的詳細說明混合註釋,但這很少需要。在大多數情況下使用其中一種:

http://howtodoinjava.com/jpa/field-vs-property-vs-mixed-access-modes-jpa-tutorial/

+0

非常感謝!就是這樣! –

+0

@ArikGabay。那麼你應該接受答案。 –