Java Hibernate/SQL Server算术溢出将int转换为数据类型numeric时出错
使用Java+Hibernate将MySQL数据库转换为SQL Server 2008数据库。遇到这个奇怪的错误消息 我知道这意味着某个地方的整数太大,无法放入它在SQL Server数据库上对应的数字(x,y),但我看不到任何地方是这样的 每当我试图向球员的统计数据中添加内容时,就会发生这种情况。下面是Player.java属性Java Hibernate/SQL Server算术溢出将int转换为数据类型numeric时出错,java,sql,sql-server,hibernate,Java,Sql,Sql Server,Hibernate,使用Java+Hibernate将MySQL数据库转换为SQL Server 2008数据库。遇到这个奇怪的错误消息 我知道这意味着某个地方的整数太大,无法放入它在SQL Server数据库上对应的数字(x,y),但我看不到任何地方是这样的 每当我试图向球员的统计数据中添加内容时,就会发生这种情况。下面是Player.java属性 @Entity(name = "player") public class Player { @Id @GeneratedValue(strategy = Gener
@Entity(name = "player")
public class Player {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Integer playerId;
@ElementCollection
@CollectionTable(name = "playerposition", joinColumns = @JoinColumn(name = "playerid"))
@Column(name = "position")
@Fetch(FetchMode.JOIN)
Set<String> positions = new HashSet<String>();
@OneToMany(fetch = FetchType.LAZY, cascade=CascadeType.ALL, mappedBy="player")
@Fetch(FetchMode.JOIN)
Set<PlayerSeason> seasons = new HashSet<PlayerSeason>();
@Column
String name;
@Column
String nickName;
@Column
Date birthDay;
@Column
Date deathDay;
@Column
String battingHand;
@Column
String throwingHand;
@Column
String birthCity;
@Column
String birthState;
@Column
String college;
@Column
Date firstGame;
@Column
Date lastGame;
@SuppressWarnings("serial")
@Entity(name = "playerseason")
public class PlayerSeason implements Serializable {
@Id
@ManyToOne
@JoinColumn(name = "playerid", referencedColumnName = "playerid", insertable = false, updatable = false)
public Player player;
@Id
@Column
public Integer year;
@Column
int gamesPlayed;
@Column
double salary;
@OneToOne(cascade=CascadeType.ALL, mappedBy="id")
BattingStats battingStats;
@OneToOne(cascade=CascadeType.ALL, mappedBy="id")
FieldingStats fieldingStats;
@OneToOne(cascade=CascadeType.ALL, mappedBy="id")
PitchingStats pitchingStats;
@OneToOne(cascade=CascadeType.ALL, mappedBy="id")
CatchingStats catchingStats;
@SuppressWarnings("serial")
@Entity(name="catchingstats")
public class CatchingStats implements Serializable{
@Id
@OneToOne
@JoinColumns({
@JoinColumn(name="playerid"),
@JoinColumn(name="year")
})
PlayerSeason id;
@Column
Integer passedBalls;
@Column
Integer wildPitches;
@Column
Integer stealsAllowed;
@Column
Integer stealsCaught;
下面是CatchingStats.java属性
@Entity(name = "player")
public class Player {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Integer playerId;
@ElementCollection
@CollectionTable(name = "playerposition", joinColumns = @JoinColumn(name = "playerid"))
@Column(name = "position")
@Fetch(FetchMode.JOIN)
Set<String> positions = new HashSet<String>();
@OneToMany(fetch = FetchType.LAZY, cascade=CascadeType.ALL, mappedBy="player")
@Fetch(FetchMode.JOIN)
Set<PlayerSeason> seasons = new HashSet<PlayerSeason>();
@Column
String name;
@Column
String nickName;
@Column
Date birthDay;
@Column
Date deathDay;
@Column
String battingHand;
@Column
String throwingHand;
@Column
String birthCity;
@Column
String birthState;
@Column
String college;
@Column
Date firstGame;
@Column
Date lastGame;
@SuppressWarnings("serial")
@Entity(name = "playerseason")
public class PlayerSeason implements Serializable {
@Id
@ManyToOne
@JoinColumn(name = "playerid", referencedColumnName = "playerid", insertable = false, updatable = false)
public Player player;
@Id
@Column
public Integer year;
@Column
int gamesPlayed;
@Column
double salary;
@OneToOne(cascade=CascadeType.ALL, mappedBy="id")
BattingStats battingStats;
@OneToOne(cascade=CascadeType.ALL, mappedBy="id")
FieldingStats fieldingStats;
@OneToOne(cascade=CascadeType.ALL, mappedBy="id")
PitchingStats pitchingStats;
@OneToOne(cascade=CascadeType.ALL, mappedBy="id")
CatchingStats catchingStats;
@SuppressWarnings("serial")
@Entity(name="catchingstats")
public class CatchingStats implements Serializable{
@Id
@OneToOne
@JoinColumns({
@JoinColumn(name="playerid"),
@JoinColumn(name="year")
})
PlayerSeason id;
@Column
Integer passedBalls;
@Column
Integer wildPitches;
@Column
Integer stealsAllowed;
@Column
Integer stealsCaught;
我95%确信问题在于统计数据,因为当我不在球员的赛季“赛季”集合中添加任何东西时,它就起作用了。但是,只要我尝试添加任何统计数据(捕捉、命中或其他),它就会抛出异常,并且Hibernate不会持久化播放器
有人能发现这个问题吗
-----编辑-----这是数据库的ddl
create table player (
playerId numeric(10,0) IDENTITY(10000,5) primary key,
name varchar(100) not null,
nickName varchar(255),
birthDay date,
deathDay date,
battingHand varchar(1) check (battingHand in ('L', 'R', 'S')),
throwingHand varchar(1) check (throwingHand in ('L', 'R')),
birthCity varchar(50),
birthState varchar(2),
college varchar(50),
firstGame date,
lastGame date,
CONSTRAINT uniqueConstraint_Player UNIQUE (name, birthDay, deathDay));
create table playerposition (
playerId numeric(10,0),
position varchar(10),
primary key(playerId, position),
foreign key(playerId) references player on delete cascade);
create table playerseason (
playerId numeric(10,0) references player on delete cascade,
year numeric(4,0),
gamesPlayed numeric(3,0),
salary numeric(12,2),
primary key (playerId, year));
create table battingstats (
playerId numeric(10,0),
year numeric(4,0),
atBats numeric(4,0),
hits numeric(4,0),
doubles numeric(4,0),
triples numeric(4,0),
homeRuns numeric(4,0),
runsBattedIn numeric(4,0),
strikeouts numeric(4,0),
walks numeric(4,0),
hitByPitch numeric(4,0),
intentionalWalks numeric(4,0),
steals numeric(4,0),
stealsAttempted numeric(4,0),
primary key(playerId, year),
foreign key(playerId, year) references playerseason on delete cascade);
create table catchingstats (
playerId numeric(10,0),
year numeric(4,0),
passedBalls numeric(4,0),
wildPitches numeric(4,0),
stealsAllowed numeric(4,0),
stealsCaught numeric(4,0),
primary key(playerId, year),
foreign key(playerId, year) references playerseason on delete cascade);
create table fieldingstats (
playerId numeric(10,0),
year numeric(4,0),
errors numeric(4,0),
putOuts numeric(4,0),
primary key(playerId, year),
foreign key(playerId, year) references playerseason on delete cascade);
create table pitchingstats (
playerId numeric(10,0),
year numeric(4,0),
outsPitched numeric(4,0),
earnedRunsAllowed numeric(4,0),
homeRunsAllowed numeric(4,0),
strikeouts numeric(4,0),
walks numeric(4,0),
wins numeric(4,0),
losses numeric(4,0),
wildPitches numeric(4,0),
battersFaced numeric(4,0),
hitBatters numeric(4,0),
saves numeric(4,0),
primary key(playerId, year),
foreign key(playerId, year) references playerseason on delete cascade);
create table team (
teamId varchar(3),
otherId varchar(3),
name varchar(50),
league varchar(2),
yearFounded numeric(4,0),
yearLast numeric(4,0),
primary key(teamId));
create table teamseason (
teamId varchar(3),
year numeric(4,0),
gamesPlayed int,
wins int check (wins >= 0),
losses int check (losses >= 0),
rank int,
totalAttendance int,
primary key(teamId, year),
foreign key(teamId) references team);
create table teamseasonplayer (
teamId varchar(3),
year numeric(4,0),
playerId numeric(10,0),
primary key(teamId,year,playerId),
foreign key (teamId) references team,
foreign key (playerId) references player);
-----编辑-----这是Eclipse打印的堆栈跟踪
2014年4月30日下午2:19:58 org.hibernate.engine.jdbc.spi.SqlExceptionHelper日志异常
警告:SQL错误:8115,SQLState:S0008
2014年4月30日下午2:19:58 org.hibernate.engine.jdbc.spi.SqlExceptionHelper日志异常
错误:将int转换为数据类型numeric时出现算术溢出错误。
2014年4月30日下午2:19:58 org.hibernate.engine.jdbc.batch.internal.AbstractBatchImpl发布
信息:HH000010:在批处理发布时,它仍然包含JDBC语句
org.hibernate.exception.sqlgrammareexception:无法执行语句
位于org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:123)
位于org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
位于org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126)
位于org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:112)
位于org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:190)
位于org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:62)
位于org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3124)
位于org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3581)
位于org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:103)
位于org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:461)
位于org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:347)
位于org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:350)
位于org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:56)
位于org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1222)
位于org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:425)
位于org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101)
位于org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:177)
位于dataaccesslayer.HibernateUtil.persistPlayer(HibernateUtil.java:131)
Convert.convertPlayer(Convert.java:116)
位于conversion.Convert.main(Convert.java:30)
原因:com.microsoft.sqlserver.jdbc.SQLServerException:将int转换为数据类型numeric时出现算术溢出错误。
位于com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:216)
位于com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1515)
位于com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:404)
位于com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:350)
位于com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:5696)
位于com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1715)
位于com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:180)
位于com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:155)
位于com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeUpdate(SQLServerPreparedStatement.java:314)
位于org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:187)
... 15更多
请发布stacktrace。您可以尝试使用,以便在错误发生时查看包含参数的语句。可能是Hibernate正在验证数据类型,而不是实际值。您为统计信息定义的许多列都是数字(4,0),因此Hibernate可能会抱怨此数据类型不够大,无法存储整数。您是否尝试过增加这些数据类型的大小?