Hibernate一对多映射错误 - mappedBy引用一个未知的目标实体属性错误 [英] Hibernate one to many mapping error - mappedBy reference an unknown target entity property error

查看:2309
本文介绍了Hibernate一对多映射错误 - mappedBy引用一个未知的目标实体属性错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想通过从域对象创建表来测试一对多映射,但我看到 mappedBy引用未知的目标实体属性



Employee.java

/ p>

  import javax.persistence.Column; 
import javax.persistence.DiscriminatorColumn;
import javax.persistence.DiscriminatorType;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.Table;
import org.hibernate.annotations.Type;
import org.joda.time.DateTime;


@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name =employeetype,discriminatorType
= DiscriminatorType.STRING)
@Table(name =Employee)
public abstract class Employee {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@ column(name =id)
private int id;

@Column(name =name)
private String name;

@Enumerated(EnumType.STRING)
@Column(name =status)
private EmployeeStatus status;

@Type(type =org.jadira.usertype.dateandtime.joda.PersistentDateTime)
@Column(name =hireDate)
private DateTime hireDate;

/ **
* @return the hireDate
* /
public DateTime getHireDate(){
return hireDate;
}

/ **
* @返回id
* /
public int getId(){
return id;
}

/ **
* @返回名称
* /
public String getName(){
return name;
}

/ **
* @返回状态
* /
public EmployeeStatus getStatus(){
return status;
}

/ **
* @param hireDate
* hireDate设置
* /
public void setHireDate(final DateTime hireDate ){
this.hireDate = hireDate;
}

/ **
* @param id
*要设置的ID
* /
public void setId ){
this.id = id;
}

/ **
* @param name
*要设置的名称
* /
public void setName ){
this.name = name;
}

/ **
* @param status
*要设置的状态
* /
public void setStatus(final EmployeeStatus status ){
this.status = status;
}

}

FulltimeEmployee.java

  import javax.persistence.Column; 
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;


@Entity
@DiscriminatorValue(FulltimeEmployee)
@Table(name =FulltimeEmployee)
public class FulltimeEmployee extends Employee {

@Column(name =cubeNumber)
private String cubeNumber;

@ManyToOne
@JoinColumn(name =id)
private FlightBenefit flightBenefit;

/ **
* @return cubeNumber
* /
public String getCubeNumber(){
return cubeNumber;
}

/ **
* @return flightBenefit
* /
public FlightBenefit getFlightBenefit(){
return flightBenefit;
}

/ **
* @param cubeNumber
*要设置的cubeNumber
* /
public void setCubeNumber(final String cubeNumber ){
this.cubeNumber = cubeNumber;
}

/ **
* @param flightBenefit
* flightBenefit设置
* /
public void setFlightBenefit(final FlightBenefit flightBenefit ){
this.flightBenefit = flightBenefit;
}

}

ContractEmployee.java

  import javax.persistence.Column; 
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.Table;


@Entity
@DiscriminatorValue(ContractEmployee)
@Table(name =ContractEmployee)
public class ContractEmployee extends Employee {

@Column(name =openAreaNumber)
private String openAreaNumber;

/ **
* @返回openAreaNumber
* /
public String getOpenAreaNumber(){
return openAreaNumber;
}

/ **
* @param openAreaNumber
* openAreaNumber设置
* /
public void setOpenAreaNumber(final String openAreaNumber ){
this.openAreaNumber = openAreaNumber;
}

}

FlightBenefit.java

  import java.util.Set; 
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import org.hibernate.annotations.Type;
import org.joda.time.DateTime;


@Entity
@Table(name =FlightBenefit)
public class FlightBenefit {

@Id
@ GeneratedValue(strategy = GenerationType.AUTO)
@Column(name =id)
private String id;

@Type(type =org.jadira.usertype.dateandtime.joda.PersistentDateTime)
@Column(name =useByTime)
private DateTime useByTime;

@Column(name =discountAmount)
private String discountAmount;

@OneToMany(mappedBy =FlightBenefit)
private Set& lt; FulltimeEmployee& gt; FulltimeEmployees;

/ **
* @return the discountAmount
* /
public String getDiscountAmount(){
return discountAmount;
}

/ **
* @返回fulltimeEmployees
* /
public Set& lt; FulltimeEmployee& getFulltimeEmployees(){
return FulltimeEmployees;
}

/ **
* @返回id
* /
public String getId(){
return id;
}

/ **
* @返回useByTime
* /
public DateTime getUseByTime(){
return useByTime;
}

/ **
* @param discountAmount
* discountAmount设置
* /
public void setDiscountAmount ){
this.discountAmount = discountAmount;
}

/ **
* @param fulltimeEmployees
* fulltimeEmployees设置
* /
public void setFulltimeEmployees(final Set& lt; FulltimeEmployee& gt; fulltimeEmployees){
FulltimeEmployees = fulltimeEmployees;
}

/ **
* @param id
*要设置的ID
* /
public void setId ){
this.id = id;
}

/ **
* @param useByTime
* useByTime设置
* /
public void setUseByTime(final DateTime useByTime ){
this.useByTime = useByTime;
}

}

EmployeeStatus

  public enum EmployeeStatus {

ACTIVE,

不活动

}

hibernate.cfg.xml p>

 ?xml version =1.0encoding =UTF-8? 
!DOCTYPE hibernate-configuration PUBLIC
- // Hibernate / Hibernate配置DTD 3.0 // EN
http://www.hibernate.org/dtd/hibernate-configuration-3.0 .dtd
hibernate-configuration
session-factory
property name =connection.driver_class& gt; com.mysql.jdbc.Driver& lt; / property

name =connection.url& gt; jdbc:mysql:// localhost:3306 / TestDB& lt; / property
property name =connection.username& gt; user& lt ; / property
property name =connection.password& gt; password123& lt; / property
property name =show_sql& gt; true& lt; / property
name =dialect& gt; org.hibernate.dialect.MySQLDialect& lt; / property
property name =hibernate.default_schema& gt; TestSchema& / property
! & lt; property name =hbm2ddl.auto& gt; validate& lt; / property& gt; -
/ session-factory&
/ hibernate-configuration&


** Main.java **



import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.joda.time.DateTime;


public class Main {

public static void main(final String args []){

配置config = new Configuration );
config.addAnnotatedClass(ContractEmployee.class);
config.addAnnotatedClass(FulltimeEmployee.class);
config.addAnnotatedClass(FlightBenefit.class);

config.configure(hibernate.cfg.xml);

SchemaExport se = new SchemaExport(config);
se.execute(true,true,false,true);

SessionFactory factory = config.buildSessionFactory();

会话session = factory.openSession();
session.beginTransaction();

ContractEmployee cEmployee = new ContractEmployee();
cEmployee.setName(Raj);
cEmployee.setStatus(EmployeeStatus.ACTIVE);
cEmployee.setHireDate(DateTime.now());
cEmployee.setOpenAreaNumber(421a29);
session.save(cEmployee);

FlightBenefit flightbenefit = new FlightBenefit();
flightbenefit.setDiscountAmount(1000);
flightbenefit.setUseByTime(DateTime.now());

FulltimeEmployee fEmployee = new FulltimeEmployee();
fEmployee.setName(Teja);
fEmployee.setStatus(EmployeeStatus.INACTIVE);
fEmployee.setHireDate(DateTime.now());
fEmployee.setCubeNumber(Cube 19);
fEmployee.setFlightBenefit(flightbenefit);
session.save(fEmployee);

session.flush();
session.getTransaction()。commit();
session.close();

}
}

strong>

  June 1,2013 2:21:14 AM org.hibernate.annotations.common.Version& lt; clinit& 。 
信息:HCANN000001:Hibernate Commons Annotations {4.0.2.Final}
2013年6月1日上午2:21:14 org.hibernate.Version logVersion
信息:HHH000412:Hibernate Core {4.2 .2.Final}
2013年6月1日下午2:21:14 org.hibernate.cfg.Environment& lt; clinit& gt;
信息:HHH000206:未找到hibernate.properties
2013年6月1日上午2:21:14 org.hibernate.cfg.Environment buildBytecodeProvider
INFO:HHH000021:字节码提供程序名称:javassist
6月1,2013 2:21:14 AM org.hibernate.cfg.Configuration配置
信息:HHH000043:从资源配置:hibernate.cfg.xml
2013年6月1日2:21:14 AM org.hibernate.cfg.Configuration getConfigurationInputStream
INFO:HHH000040:配置资源:hibernate.cfg.xml
2013年6月1日上午2:21:14 org.hibernate.cfg.Configuration doConfigure
信息:HHH000041:Configured SessionFactory:null
2013年6月1日上午2:21:14 org.hibernate.dialect.Dialect& lt; init& gt;
信息:HHH000400:使用方言:org.hibernate.dialect.MySQLDialect
June 1,2013 2:21:15 AM org.hibernate.cfg.AnnotationBinder bindClass
WARN:HHH000139:Illegal use @Table在SINGLE_TABLE层次结构的子类中:
ContractEmployee
2013年6月1日上午2:21:15 org.hibernate.cfg.AnnotationBinder bindClass
WARN:HHH000139:非法使用@在SINGLE_TABLE层次结构的子类中的表:
FulltimeEmployee
线程main中的异常org.hibernate.AnnotationException:mappedBy引用
未知目标实体属性:FulltimeEmployee.FlightBenefit in
FlightBenefit.FulltimeEmployees在org.hibernate.cfg.annotations.CollectionBinder.bindStarToManySecondPass(CollectionBinder.java:708)
在org.hibernate.cfg.annotations.CollectionBinder $ 1.secondPass(CollectionBinder.java:668)
在org.hibernate.cfg.CollectionSecondPass.doSecondPass(CollectionSecondPass.java:69)
在org.hibernate.cfg.Configuration.originalSecondPassCompile(Configuration.java:1611)
在org.hibernate.cfg.Configuration .secondPassCompile(Configuration.java:1369)
at org.hibernate.cfg.Configuration.generateDropSchemaScript(Configuration.java:941)
at org.hibernate.tool.hbm2ddl.SchemaExport。& lt; init& ; gt;(SchemaExport.java:188)
at org.hibernate.tool.hbm2ddl.SchemaExport。& lt; init& gt;(SchemaExport.java:156)
at Main.main .java:23)






感谢您的回复。我进行了您提到的更改,也做了一些其他更改,如添加 session.save(flightBenefit)到Main.java和 insertable = false,updatable = false 与@JoinColumn注解。我看到Employee表创建,但不是FlightBenefit,并看到错误



导致: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:Table'TestSchema .flightbenefit'不存在



以下是更新后的更改和stacktrace的类



Main.java

  import org.hibernate.Session; 
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.joda.time.DateTime;


public class Main {

public static void main(final String args []){

配置config = new Configuration );
config.addAnnotatedClass(ContractEmployee.class);
config.addAnnotatedClass(FulltimeEmployee.class);
config.addAnnotatedClass(FlightBenefit.class);
config.configure(hibernate.cfg.xml);

SchemaExport se = new SchemaExport(config);
se.execute(true,true,false,true);

SessionFactory factory = config.buildSessionFactory();

会话session = factory.openSession();
session.beginTransaction();

FlightBenefit flightbenefit = new FlightBenefit();
flightbenefit.setDiscountAmount(1000);
flightbenefit.setUseByTime(DateTime.now());
session.save(flightbenefit);

ContractEmployee cEmployee = new ContractEmployee();
cEmployee.setName(Raj);
cEmployee.setStatus(EmployeeStatus.ACTIVE);
cEmployee.setHireDate(DateTime.now());
cEmployee.setOpenAreaNumber(421a29);
session.save(cEmployee);



FulltimeEmployee fEmployee = new FulltimeEmployee();
fEmployee.setName(Teja);
fEmployee.setStatus(EmployeeStatus.INACTIVE);
fEmployee.setHireDate(DateTime.now());
fEmployee.setCubeNumber(Cube 19);
fEmployee.setFlightBenefit(flightbenefit);
session.save(fEmployee);

session.flush();
session.getTransaction()。commit();
session.close();

}
}

FulltimeEmployee.Java

  import javax.persistence.Column; 
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;


@Entity
@DiscriminatorValue(FulltimeEmployee)
public class FulltimeEmployee extends Employee {

@Column(name =cubeNumber )
private String cubeNumber;

@ManyToOne
@JoinColumn(name =id,insertable = false,updatable = false)
private FlightBenefit flightBenefit;

/ **
* @return cubeNumber
* /
public String getCubeNumber(){
return cubeNumber;
}

/ **
* @return flightBenefit
* /
public FlightBenefit getFlightBenefit(){
return flightBenefit;
}

/ **
* @param cubeNumber
*要设置的cubeNumber
* /
public void setCubeNumber(final String cubeNumber ){
this.cubeNumber = cubeNumber;
}

/ **
* @param flightBenefit
* flightBenefit设置
* /
public void setFlightBenefit(final FlightBenefit flightBenefit ){
this.flightBenefit = flightBenefit;
}

}

FlightBenefit.java

  import java.util.Set; 

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import org.hibernate.annotations.Type;
import org.joda.time.DateTime;


@Entity
@Table(name =FlightBenefit)
public class FlightBenefit {

@Id
@ GeneratedValue(strategy = GenerationType.AUTO)
@Column(name =id)
private String id;

@Type(type =org.jadira.usertype.dateandtime.joda.PersistentDateTime)
@Column(name =useByTime)
private DateTime useByTime;

@Column(name =discountAmount)
private String discountAmount;

@OneToMany(mappedBy =flightBenefit)
private Set< FulltimeEmployee> FulltimeEmployees;

/ **
* @return the discountAmount
* /
public String getDiscountAmount(){
return discountAmount;
}

/ **
* @返回fulltimeEmployees
* /
public Set< FulltimeEmployee> getFulltimeEmployees(){
return FulltimeEmployees;
}

/ **
* @返回id
* /
public String getId(){
return id;
}

/ **
* @返回useByTime
* /
public DateTime getUseByTime(){
return useByTime;
}

/ **
* @param discountAmount
* discountAmount设置
* /
public void setDiscountAmount ){
this.discountAmount = discountAmount;
}

/ **
* @param fulltimeEmployees
* fulltimeEmployees设置
* /
public void setFulltimeEmployees(final Set< FulltimeEmployee> fulltimeEmployees){
FulltimeEmployees = fulltimeEmployees;
}

/ **
* @param id
*要设置的ID
* /
public void setId ){
this.id = id;
}

/ **
* @param useByTime
* useByTime设置
* /
public void setUseByTime(final DateTime useByTime ){
this.useByTime = useByTime;
}

}

StackTrace

  June 1,2013 2:18:18 PM org.hibernate.annotations.common.Version< clinit> 
信息:HCANN000001:Hibernate Commons Annotations {4.0.2.Final}
2013年6月1日下午2:18:18 org.hibernate.Version logVersion
信息:HHH000412:Hibernate Core {4.2 .2.Final}
2013年6月1日下午2:18:18 org.hibernate.cfg.Environment< clinit>
信息:HHH000206:找不到hibernate.properties
June 1,2013 2:18:18 PM org.hibernate.cfg.Environment buildBytecodeProvider
INFO:HHH000021:字节码提供程序名称:javassist
6月1,2013 2:18:18 PM org.hibernate.cfg.Configuration配置
信息:HHH000043:从资源配置:hibernate.cfg.xml
2013年6月1日2:18:18 PM org.hibernate.cfg.Configuration getConfigurationInputStream
INFO:HHH000040:配置资源:hibernate.cfg.xml
2013年6月1日下午2:18:19 org.hibernate.cfg.Configuration doConfigure
信息:HHH000041:Configured SessionFactory:null
2013年6月1日下午2:18:19 org.hibernate.dialect.Dialect< init>
信息:HHH000400:使用方言:org.hibernate.dialect.MySQLDialect
2013年6月1日2:18:21 org.hibernate.tool.hbm2ddl.SchemaExport执行
信息:HHH000227:运行hbm2ddl模式导出
2013年6月1日下午2:18:21
org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl
configure
信息:HHH000402:使用Hibernate内置连接池(不用于生产使用!)
2013年6月1日下午2:18:21
org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl
configure
信息:HHH000115:Hibernate连接池大小:20
2013年6月1日2:18:21 PM
org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl
configure
INFO:HHH000006:Autocommit mode:false
2013年6月1日下午2:18:21
org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl
configure
信息:HHH000401:使用驱动程序[com.mysql.jdbc.Driver]在URL
[jdbc:mysql:// localhost:3306 / TestSchema]
2013年6月1日2:18:21 PM b $ b org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl
configure
INFO:HHH000046:连接属性:{user = user,password = ****}

create table TestSchema.Employee(
employeetype varchar(31)not null,
id integer not null auto_increment,
hireDate datetime,
name varchar(255),
status varchar(255),
openAreaNumber varchar(255),
cubeNumber varchar(255),
主键(id)


create table TestSchema.FlightBenefit(
id varchar(255)not null auto_increment,
discountAmount varchar(255),
useByTime datetime,
主键(id)

6月1,2013 2:18:23 PM org.hibernate.tool.hbm2ddl.SchemaExport执行
错误:HHH000389:不成功:create table TestSchema.FlightBenefit(id varchar(255)
not null auto_increment ,discountAmount varchar(255),useByTime datetime,主键
(id))
org.hibernate.tool.hbm2ddl.SchemaExport执行
错误:列'id'的列标识符不正确

alter table TestSchema.Employee
添加索引FK_opia9u461cgfe5i9vk7bo0p56(id),
添加约束FK_opia9u461cgfe5i9vk7bo0p56
外键$ b引用TestSchema.FlightBenefit(id)
2013年6月1日下午2:18:23 org.hibernate.tool.hbm2ddl.SchemaExport执行
错误:HHH000389:不成功:alter table TestSchema.Employee add index
FK_opia9u461cgfe5i9vk7bo0p56(id),添加约束FK_opia9u461cgfe5i9vk7bo0p56 foreign
key(id)引用TestSchema.FlightBenefit(id)
org.hibernate.tool.hbm2ddl。 SchemaExport执行
错误:无法添加外键约束
June 1,2013 2:18:23 PM
org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl
stop
INFO:HHH000030:清理连接池[jdbc:mysql:// localhost:3306 / TestSchema]
2013年6月1日下午2:18:23 org.hibernate.tool.hbm2ddl.SchemaExport执行
信息:HHH000230:模式导出完成
2013年6月1日下午2:18:23
org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl
configure
INFO :HHH000402:使用Hibernate内置的连接池(不用于生产使用!)

2013年6月1日下午2:18:23

org.hibernate.service.jdbc .connections.internal.DriverManagerConnectionProviderImpl
configure
INFO:HHH000115:Hibernate连接池大小:20
2013年6月1日下午2:18:23
org.hibernate.service.jdbc .connections.internal.DriverManagerConnectionProviderImpl
configure

INFO:HHH000006:Autocommit模式:false
2013年6月1日下午2:18:23
org.hibernate.service .jdbc.connections.internal.DriverManagerConnectionProviderImpl
configure
INFO:HHH000401:在URL
使用驱动程序[com.mysql.jdbc.Driver] [jdbc:mysql:// localhost:3306 / TestSchema ]
June 1,2013 2:18:23 PM
org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl
configure
INFO:HHH000046:连接属性:{user = user,password = ****}
June 1,2013 2:18:23 PM org.hibernate.dialect.Dialect< init>
信息:HHH000400:使用方言:org.hibernate.dialect.MySQLDialect
2013年6月1日下午2:18:23
org.hibernate.engine.transaction.internal.TransactionFactoryInitiator initiateService
INFO:HHH000399:使用默认事务策略(直接JDBC事务)
2013年6月1日下午2:18:23 org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory< init>
信息:HHH000397:使用ASTQueryTranslatorFactory
Hibernate:insert into TestSchema.FlightBenefit(discountAmount,useByTime)values(?,
?)
2013年6月1日下午2:18:25 org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
WARN:SQL错误:1146,SQLState:42S02
6月1日,2013 2:18:25下午org.hibernate.engine.jdbc.spi。 SqlExceptionHelper logExceptions
错误:表'TestSchema.flightbenefit'不存在
线程main中的异常org.hibernate.exception.SQLGrammarException:无法
执行语句
at
org.hibernate.exception.internal.SQLExceptionTypeDelegate。
convert(SQLExceptionTypeDelegate.java:82)
at org.hibernate.exception.internal.StandardSQLExceptionConverter。
convert(StandardSQLExceptionConverter.java:49)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper。
convert(SqlExceptionHelper.java:125)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper。
convert(SqlExceptionHelper.java:110)
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl。
executeUpdate(ResultSetReturnImpl.java:136)
at
org.hibernate.id.IdentityGenerator $ GetGeneratedKeysDelegate。
executeAndExtract(IdentityGenerator.java:96)
at org.hibernate.id.insert.AbstractReturningDelegate。
performInsert(AbstractReturningDelegate.java:58)
at org.hibernate.persister.entity.AbstractEntityPersister。
insert(AbstractEntityPersister.java:2975)
at org.hibernate.persister.entity.AbstractEntityPersister。
insert(AbstractEntityPersister.java:3487)
在org.hibernate.action.internal.EntityIdentityInsertAction。
在org.hibernate.engine.spi.ActionQueue的org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:377)
上执行(EntityIdentityInsertAction.java:81)

addResolvedEntityInsertAction(ActionQueue.java:214)
在org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:194)
在org.hibernate.engine.spi.ActionQueue。 addAction(ActionQueue.java:178)
at org.hibernate.event.internal.AbstractSaveEventListener。
addInsertAction(AbstractSaveEventListener.java:321)
at org.hibernate.event.internal.AbstractSaveEventListener。
performSaveOrReplicate(AbstractSaveEventListener.java:286)
at org.hibernate.event.internal.AbstractSaveEventListener。
performSave(AbstractSaveEventListener.java:192)
在org.hibernate.event.internal.AbstractSaveEventListener。
saveWithGeneratedId(AbstractSaveEventListener.java:125)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener。
saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:206)
at org.hibernate.event.internal.DefaultSaveEventListener。
saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:55)
在org.hibernate.event.internal.DefaultSaveOrUpdateEventListener。
entityIsTransient(DefaultSaveOrUpdateEventListener.java:191)
at org.hibernate.event.internal.DefaultSaveEventListener。
performSaveOrUpdate(DefaultSaveEventListener.java:49)
在org.hibernate.event.internal.DefaultSaveOrUpdateEventListener。
onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90)
在org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:764)
在org.hibernate.internal.SessionImpl.save(SessionImpl。 java:756)
at org.hibernate.internal.SessionImpl.save(SessionImpl.java:752)
在Main.main(Main.java:34)
Caused by:com.mysql .jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:Table
'TestSchema.flightbenefit'不存在
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native方法)
在sun.reflect.NativeConstructorAccessorImpl。 newInstance(未知源)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(未知源)
at java.lang.reflect.Constructor.newInstance(未知源)
at com.mysql.jdbc。 Util.handleNewInstance(Util.java:411)
at com.mysql.jdbc.Util.getInstance(Util.java:386)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java: 1054)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4120)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4052)
at com .mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2503)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2664)
at com.mysql.jdbc.ConnectionImpl.execSQL (ConnectionImpl.java:2815)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2458)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2375)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2359)
at

org.hibernate.engine.jdbc.internal.ResultSetReturnImpl。
executeUpdate(ResultSetReturnImpl.java:133)
... 22更多


解决方案

回答原始问题:



以下是不正确的,因为 FulltimeEmployee 没有名为 FlightBenefit的持久属性

  @OneToMany(mappedBy =FlightBenefit)
private Set< FulltimeEmployee> FulltimeEmployees;

持久属性的名称区分大小写。因为属性是 flightBenefit (第一个字符是小写),在mappedBy中使用时名称应该完全相同:

  @OneToMany(mappedBy =flightBenefit)

在子类中使用表注释对SINGLE_TABLE没有意义:它们被持久化为单个表,因此表是相同的。



修改后回答问题:



现在问题来自:

  @ Id 
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name =id)
private String id;

这不起作用,因为String(数据库中的varchar)没有自动增量。在日志中也会出现以下消息:列'id'的列标识符不正确。如果可行,请改用Integer / Long。


I am trying to test one to many mapping by creating tables from domain objects but I see the error mappedBy reference an unknown target entity property. Could some one take a look please?

Thanks

Employee.java

import javax.persistence.Column;
import javax.persistence.DiscriminatorColumn;
import javax.persistence.DiscriminatorType;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;  
import javax.persistence.InheritanceType;
import javax.persistence.Table;
import org.hibernate.annotations.Type;
import org.joda.time.DateTime;


@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "employeetype", discriminatorType    
=DiscriminatorType.STRING)
@Table(name = "Employee")
public abstract class Employee {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private int id;

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

@Enumerated(EnumType.STRING)
@Column(name = "status")
private EmployeeStatus status;

@Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime")
@Column(name = "hireDate")
private DateTime hireDate;

/**
 * @return the hireDate
 */
public DateTime getHireDate() {
    return hireDate;
}

/**
 * @return the id
 */
public int getId() {
    return id;
}

/**
 * @return the name
 */
public String getName() {
    return name;
}

/**
 * @return the Status
 */
public EmployeeStatus getStatus() {
    return status;
}

/**
 * @param hireDate
 *            the hireDate to set
 */
public void setHireDate(final DateTime hireDate) {
    this.hireDate = hireDate;
}

/**
 * @param id
 *            the id to set
 */
public void setId(final int id) {
    this.id = id;
}

/**
 * @param name
 *            the name to set
 */
public void setName(final String name) {
    this.name = name;
}

/**
 * @param status
 *            the status to set
 */
public void setStatus(final EmployeeStatus status) {
    this.status = status;
}

}

FulltimeEmployee.java

import javax.persistence.Column;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;


@Entity
@DiscriminatorValue("FulltimeEmployee")
@Table(name = "FulltimeEmployee")
public class FulltimeEmployee extends Employee {

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

@ManyToOne
@JoinColumn(name = "id")
private FlightBenefit flightBenefit;

/**
 * @return the cubeNumber
 */
public String getCubeNumber() {
    return cubeNumber;
}

/**
 * @return the flightBenefit
 */
public FlightBenefit getFlightBenefit() {
    return flightBenefit;
}

/**
 * @param cubeNumber
 *            the cubeNumber to set
 */
public void setCubeNumber(final String cubeNumber) {
    this.cubeNumber = cubeNumber;
}

/**
 * @param flightBenefit
 *            the flightBenefit to set
 */
public void setFlightBenefit(final FlightBenefit flightBenefit) {
    this.flightBenefit = flightBenefit;
}

}

ContractEmployee.java

import javax.persistence.Column;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.Table;


@Entity
@DiscriminatorValue("ContractEmployee")
@Table(name = "ContractEmployee")
public class ContractEmployee extends Employee {

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

/**
 * @return the openAreaNumber
 */
public String getOpenAreaNumber() {
    return openAreaNumber;
}

/**
 * @param openAreaNumber
 *            the openAreaNumber to set
 */
public void setOpenAreaNumber(final String openAreaNumber) {
    this.openAreaNumber = openAreaNumber;
}

}

FlightBenefit.java

import java.util.Set;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import org.hibernate.annotations.Type;
import org.joda.time.DateTime;


@Entity
@Table(name = "FlightBenefit")
public class FlightBenefit {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private String id;

@Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime")
@Column(name = "useByTime")
private DateTime useByTime;

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

@OneToMany(mappedBy = "FlightBenefit")
private Set&lt;FulltimeEmployee&gt; FulltimeEmployees;

/**
 * @return the discountAmount
 */
public String getDiscountAmount() {
    return discountAmount;
}

/**
 * @return the fulltimeEmployees
 */
public Set&lt;FulltimeEmployee&gt; getFulltimeEmployees() {
    return FulltimeEmployees;
}

/**
 * @return the id
 */
public String getId() {
    return id;
}

/**
 * @return the useByTime
 */
public DateTime getUseByTime() {
    return useByTime;
}

/**
 * @param discountAmount
 *            the discountAmount to set
 */
public void setDiscountAmount(final String discountAmount) {
    this.discountAmount = discountAmount;
}

/**
 * @param fulltimeEmployees
 *            the fulltimeEmployees to set
 */
public void setFulltimeEmployees(final Set&lt;FulltimeEmployee&gt; fulltimeEmployees) {
    FulltimeEmployees = fulltimeEmployees;
}

/**
 * @param id
 *            the id to set
 */
public void setId(final String id) {
    this.id = id;
}

/**
 * @param useByTime
 *            the useByTime to set
 */
public void setUseByTime(final DateTime useByTime) {
    this.useByTime = useByTime;
}

}

EmployeeStatus

public enum EmployeeStatus {

ACTIVE,

INACTIVE

}

hibernate.cfg.xml

?xml version="1.0" encoding="UTF-8"?
 !DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"
hibernate-configuration
 session-factory
property name="connection.driver_class"&gt;com.mysql.jdbc.Driver&lt;/property
property    
name="connection.url"&gt;jdbc:mysql://localhost:3306/TestDB&lt;/property
property name="connection.username"&gt;user&lt;/property
property name="connection.password"&gt;password123&lt;/property
property name="show_sql"&gt;true&lt;/property
property name="dialect"&gt;org.hibernate.dialect.MySQLDialect&lt;/property
property name="hibernate.default_schema"&gt;TestSchema&lt;/property
!--    &lt;property name="hbm2ddl.auto"&gt;validate&lt;/property&gt; --
/session-factory&
/hibernate-configuration&


**Main.java**



import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.joda.time.DateTime;


public class Main {

public static void main(final String args[]) {

    Configuration config = new Configuration();
    config.addAnnotatedClass(ContractEmployee.class);
    config.addAnnotatedClass(FulltimeEmployee.class);
    config.addAnnotatedClass(FlightBenefit.class);

    config.configure("hibernate.cfg.xml");

    SchemaExport se = new SchemaExport(config);
    se.execute(true, true, false, true);

    SessionFactory factory = config.buildSessionFactory();

    Session session = factory.openSession();
    session.beginTransaction();

    ContractEmployee cEmployee = new ContractEmployee();
    cEmployee.setName("Raj");
    cEmployee.setStatus(EmployeeStatus.ACTIVE);
    cEmployee.setHireDate(DateTime.now());
    cEmployee.setOpenAreaNumber("421a29");
    session.save(cEmployee);

    FlightBenefit flightbenefit = new FlightBenefit();
    flightbenefit.setDiscountAmount("1000");
    flightbenefit.setUseByTime(DateTime.now());

    FulltimeEmployee fEmployee = new FulltimeEmployee();
    fEmployee.setName("Teja");
    fEmployee.setStatus(EmployeeStatus.INACTIVE);
    fEmployee.setHireDate(DateTime.now());
    fEmployee.setCubeNumber("Cube 19");
    fEmployee.setFlightBenefit(flightbenefit);
    session.save(fEmployee);

    session.flush();
    session.getTransaction().commit();
    session.close();

}
}

Error StackTrace

Jun 1, 2013 2:21:14 AM org.hibernate.annotations.common.Version &lt;clinit&gt;
INFO: HCANN000001: Hibernate Commons Annotations {4.0.2.Final}
Jun 1, 2013 2:21:14 AM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {4.2.2.Final}
Jun 1, 2013 2:21:14 AM org.hibernate.cfg.Environment &lt;clinit&gt;
INFO: HHH000206: hibernate.properties not found
Jun 1, 2013 2:21:14 AM org.hibernate.cfg.Environment buildBytecodeProvider
INFO: HHH000021: Bytecode provider name : javassist
Jun 1, 2013 2:21:14 AM org.hibernate.cfg.Configuration configure
INFO: HHH000043: Configuring from resource: hibernate.cfg.xml
Jun 1, 2013 2:21:14 AM org.hibernate.cfg.Configuration getConfigurationInputStream
INFO: HHH000040: Configuration resource: hibernate.cfg.xml
Jun 1, 2013 2:21:14 AM org.hibernate.cfg.Configuration doConfigure
INFO: HHH000041: Configured SessionFactory: null
Jun 1, 2013 2:21:14 AM org.hibernate.dialect.Dialect &lt;init&gt;
INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQLDialect
Jun 1, 2013 2:21:15 AM org.hibernate.cfg.AnnotationBinder bindClass
WARN: HHH000139: Illegal use of @Table in a subclass of a SINGLE_TABLE hierarchy:     
ContractEmployee
Jun 1, 2013 2:21:15 AM org.hibernate.cfg.AnnotationBinder bindClass
WARN: HHH000139: Illegal use of @Table in a subclass of a SINGLE_TABLE hierarchy:    
FulltimeEmployee
Exception in thread "main" org.hibernate.AnnotationException: mappedBy reference an     
unknown target entity property: FulltimeEmployee.FlightBenefit in   
FlightBenefit.FulltimeEmployees at org.hibernate.cfg.annotations.CollectionBinder.bindStarToManySecondPass(CollectionBinder.java:708)
at org.hibernate.cfg.annotations.CollectionBinder$1.secondPass(CollectionBinder.java:668)
at org.hibernate.cfg.CollectionSecondPass.doSecondPass(CollectionSecondPass.java:69)
at org.hibernate.cfg.Configuration.originalSecondPassCompile(Configuration.java:1611)
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1369)
at org.hibernate.cfg.Configuration.generateDropSchemaScript(Configuration.java:941)
at org.hibernate.tool.hbm2ddl.SchemaExport.&lt;init&gt;(SchemaExport.java:188)
at org.hibernate.tool.hbm2ddl.SchemaExport.&lt;init&gt;(SchemaExport.java:156)
at Main.main(Main.java:23)


Thanks for ur reply. I made the changes you have mentioned and also made few other changes like adding session.save(flightBenefit) to Main.java and insertable = false, updatable = false with @JoinColumn annotation. I see Employee table being created but not FlightBenefit and am seeing the error

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'TestSchema.flightbenefit' doesn't exist

Below are the classes with updated changes and stacktrace

Main.java

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.joda.time.DateTime;


public class Main {

public static void main(final String args[]) {

    Configuration config = new Configuration();
    config.addAnnotatedClass(ContractEmployee.class);
    config.addAnnotatedClass(FulltimeEmployee.class);
    config.addAnnotatedClass(FlightBenefit.class);
    config.configure("hibernate.cfg.xml");

    SchemaExport se = new SchemaExport(config);
    se.execute(true, true, false, true);

    SessionFactory factory = config.buildSessionFactory();

    Session session = factory.openSession();
    session.beginTransaction();

    FlightBenefit flightbenefit = new FlightBenefit();
    flightbenefit.setDiscountAmount("1000");
    flightbenefit.setUseByTime(DateTime.now());
    session.save(flightbenefit);

    ContractEmployee cEmployee = new ContractEmployee();
    cEmployee.setName("Raj");
    cEmployee.setStatus(EmployeeStatus.ACTIVE);
    cEmployee.setHireDate(DateTime.now());
    cEmployee.setOpenAreaNumber("421a29");
    session.save(cEmployee);



    FulltimeEmployee fEmployee = new FulltimeEmployee();
    fEmployee.setName("Teja");
    fEmployee.setStatus(EmployeeStatus.INACTIVE);
    fEmployee.setHireDate(DateTime.now());
    fEmployee.setCubeNumber("Cube 19");
    fEmployee.setFlightBenefit(flightbenefit);
    session.save(fEmployee);

    session.flush();
    session.getTransaction().commit();
    session.close();

}
}

FulltimeEmployee.Java

import javax.persistence.Column;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;


@Entity
@DiscriminatorValue("FulltimeEmployee")
public class FulltimeEmployee extends Employee {

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

@ManyToOne
@JoinColumn(name = "id", insertable =  false, updatable = false)
private FlightBenefit flightBenefit;

/**
 * @return the cubeNumber
 */
public String getCubeNumber() {
    return cubeNumber;
}

/**
 * @return the flightBenefit
 */
public FlightBenefit getFlightBenefit() {
    return flightBenefit;
}

/**
 * @param cubeNumber
 *            the cubeNumber to set
 */
public void setCubeNumber(final String cubeNumber) {
    this.cubeNumber = cubeNumber;
}

/**
 * @param flightBenefit
 *            the flightBenefit to set
 */
public void setFlightBenefit(final FlightBenefit flightBenefit) {
    this.flightBenefit = flightBenefit;
}

}

FlightBenefit.java

import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import org.hibernate.annotations.Type;
import org.joda.time.DateTime;


@Entity
@Table(name = "FlightBenefit")
public class FlightBenefit {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private String id;

@Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime")
@Column(name = "useByTime")
private DateTime useByTime;

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

@OneToMany(mappedBy = "flightBenefit")
private Set<FulltimeEmployee> FulltimeEmployees;

/**
 * @return the discountAmount
 */
public String getDiscountAmount() {
    return discountAmount;
}

/**
 * @return the fulltimeEmployees
 */
public Set<FulltimeEmployee> getFulltimeEmployees() {
    return FulltimeEmployees;
}

/**
 * @return the id
 */
public String getId() {
    return id;
}

/**
 * @return the useByTime
 */
public DateTime getUseByTime() {
    return useByTime;
}

/**
 * @param discountAmount
 *            the discountAmount to set
 */
public void setDiscountAmount(final String discountAmount) {
    this.discountAmount = discountAmount;
}

/**
 * @param fulltimeEmployees
 *            the fulltimeEmployees to set
 */
public void setFulltimeEmployees(final Set<FulltimeEmployee> fulltimeEmployees) {
    FulltimeEmployees = fulltimeEmployees;
}

/**
 * @param id
 *            the id to set
 */
public void setId(final String id) {
    this.id = id;
}

/**
 * @param useByTime
 *            the useByTime to set
 */
public void setUseByTime(final DateTime useByTime) {
    this.useByTime = useByTime;
}

}

StackTrace

Jun 1, 2013 2:18:18 PM org.hibernate.annotations.common.Version <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {4.0.2.Final}
Jun 1, 2013 2:18:18 PM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {4.2.2.Final}
Jun 1, 2013 2:18:18 PM org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
Jun 1, 2013 2:18:18 PM org.hibernate.cfg.Environment buildBytecodeProvider
INFO: HHH000021: Bytecode provider name : javassist
Jun 1, 2013 2:18:18 PM org.hibernate.cfg.Configuration configure
INFO: HHH000043: Configuring from resource: hibernate.cfg.xml
Jun 1, 2013 2:18:18 PM org.hibernate.cfg.Configuration getConfigurationInputStream
INFO: HHH000040: Configuration resource: hibernate.cfg.xml
Jun 1, 2013 2:18:19 PM org.hibernate.cfg.Configuration doConfigure
INFO: HHH000041: Configured SessionFactory: null
Jun 1, 2013 2:18:19 PM org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQLDialect
Jun 1, 2013 2:18:21 PM org.hibernate.tool.hbm2ddl.SchemaExport execute
INFO: HHH000227: Running hbm2ddl schema export
Jun 1, 2013 2:18:21 PM     
org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl   
configure
INFO: HHH000402: Using Hibernate built-in connection pool (not for production use!)
Jun 1, 2013 2:18:21 PM 
 org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl 
 configure
INFO: HHH000115: Hibernate connection pool size: 20
Jun 1, 2013 2:18:21 PM     
org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl   
 configure
INFO: HHH000006: Autocommit mode: false
Jun 1, 2013 2:18:21 PM  
org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl 
configure
INFO: HHH000401: using driver [com.mysql.jdbc.Driver] at URL    
[jdbc:mysql://localhost:3306/TestSchema]
Jun 1, 2013 2:18:21 PM   
 org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl   
 configure
INFO: HHH000046: Connection properties: {user=user, password=****}

create table TestSchema.Employee (
    employeetype varchar(31) not null,
    id integer not null auto_increment,
    hireDate datetime,
    name varchar(255),
    status varchar(255),
    openAreaNumber varchar(255),
    cubeNumber varchar(255),
    primary key (id)
)

create table TestSchema.FlightBenefit (
    id varchar(255) not null auto_increment,
    discountAmount varchar(255),
    useByTime datetime,
    primary key (id)
)
Jun 1, 2013 2:18:23 PM org.hibernate.tool.hbm2ddl.SchemaExport perform
ERROR: HHH000389: Unsuccessful: create table TestSchema.FlightBenefit (id varchar(255)     
not null auto_increment, discountAmount varchar(255), useByTime datetime, primary key  
(id))
Jun 1, 2013 2:18:23 PM org.hibernate.tool.hbm2ddl.SchemaExport perform
ERROR: Incorrect column specifier for column 'id'

alter table TestSchema.Employee 
    add index FK_opia9u461cgfe5i9vk7bo0p56 (id), 
    add constraint FK_opia9u461cgfe5i9vk7bo0p56 
    foreign key (id) 
    references TestSchema.FlightBenefit (id)
Jun 1, 2013 2:18:23 PM org.hibernate.tool.hbm2ddl.SchemaExport perform
ERROR: HHH000389: Unsuccessful: alter table TestSchema.Employee add index   
FK_opia9u461cgfe5i9vk7bo0p56 (id), add constraint FK_opia9u461cgfe5i9vk7bo0p56 foreign   
 key (id) references TestSchema.FlightBenefit (id)
Jun 1, 2013 2:18:23 PM org.hibernate.tool.hbm2ddl.SchemaExport perform
ERROR: Cannot add foreign key constraint
Jun 1, 2013 2:18:23 PM   
org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl  
stop
INFO: HHH000030: Cleaning up connection pool [jdbc:mysql://localhost:3306/TestSchema]
Jun 1, 2013 2:18:23 PM org.hibernate.tool.hbm2ddl.SchemaExport execute
INFO: HHH000230: Schema export complete
Jun 1, 2013 2:18:23 PM   
org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl 
configure
INFO: HHH000402: Using Hibernate built-in connection pool (not for production use!)

Jun 1, 2013 2:18:23 PM  

org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl 
 configure
INFO: HHH000115: Hibernate connection pool size: 20
Jun 1, 2013 2:18:23 PM     
org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl 
configure

 INFO: HHH000006: Autocommit mode: false
 Jun 1, 2013 2:18:23 PM   
 org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl  
 configure
 INFO: HHH000401: using driver [com.mysql.jdbc.Driver] at URL    
[jdbc:mysql://localhost:3306/TestSchema]
Jun 1, 2013 2:18:23 PM  
org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl 
configure
INFO: HHH000046: Connection properties: {user=user, password=****}
Jun 1, 2013 2:18:23 PM org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQLDialect
Jun 1, 2013 2:18:23 PM   
org.hibernate.engine.transaction.internal.TransactionFactoryInitiator initiateService
INFO: HHH000399: Using default transaction strategy (direct JDBC transactions)
Jun 1, 2013 2:18:23 PM org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory <init>
INFO: HHH000397: Using ASTQueryTranslatorFactory
Hibernate: insert into TestSchema.FlightBenefit (discountAmount, useByTime) values (?,   
?)
Jun 1, 2013 2:18:25 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
WARN: SQL Error: 1146, SQLState: 42S02
Jun 1, 2013 2:18:25 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
ERROR: Table 'TestSchema.flightbenefit' doesn't exist
Exception in thread "main" org.hibernate.exception.SQLGrammarException: could not    
execute statement
at 
    org.hibernate.exception.internal.SQLExceptionTypeDelegate.
    convert(SQLExceptionTypeDelegate.java:82)
at org.hibernate.exception.internal.StandardSQLExceptionConverter.
    convert(StandardSQLExceptionConverter.java:49)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.
   convert(SqlExceptionHelper.java:125)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.
   convert(SqlExceptionHelper.java:110)
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.   
     executeUpdate(ResultSetReturnImpl.java:136)
at 
org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.
executeAndExtract(IdentityGenerator.java:96)
at org.hibernate.id.insert.AbstractReturningDelegate.
 performInsert(AbstractReturningDelegate.java:58)
at org.hibernate.persister.entity.AbstractEntityPersister.
 insert(AbstractEntityPersister.java:2975)
at org.hibernate.persister.entity.AbstractEntityPersister.
  insert(AbstractEntityPersister.java:3487)
at org.hibernate.action.internal.EntityIdentityInsertAction.
  execute(EntityIdentityInsertAction.java:81)
at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:377)
at org.hibernate.engine.spi.ActionQueue.
     addResolvedEntityInsertAction(ActionQueue.java:214)
at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:194)
at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:178)
at org.hibernate.event.internal.AbstractSaveEventListener.
   addInsertAction(AbstractSaveEventListener.java:321)
at org.hibernate.event.internal.AbstractSaveEventListener.
   performSaveOrReplicate(AbstractSaveEventListener.java:286)
at org.hibernate.event.internal.AbstractSaveEventListener.
      performSave(AbstractSaveEventListener.java:192)
at org.hibernate.event.internal.AbstractSaveEventListener.
      saveWithGeneratedId(AbstractSaveEventListener.java:125)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.
     saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:206)
at org.hibernate.event.internal.DefaultSaveEventListener.
  saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:55)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.
  entityIsTransient(DefaultSaveOrUpdateEventListener.java:191)
at org.hibernate.event.internal.DefaultSaveEventListener.
   performSaveOrUpdate(DefaultSaveEventListener.java:49)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.
   onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90)
at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:764)
at org.hibernate.internal.SessionImpl.save(SessionImpl.java:756)
at org.hibernate.internal.SessionImpl.save(SessionImpl.java:752)
at Main.main(Main.java:34)
   Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table     
 'TestSchema.flightbenefit' doesn't exist
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
at com.mysql.jdbc.Util.getInstance(Util.java:386)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1054)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4120)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4052)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2503)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2664)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2815)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2458)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2375)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2359)
at   

 org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.
 executeUpdate(ResultSetReturnImpl.java:133)
... 22 more

解决方案

Answer to original question:

Following is incorrect, because FulltimeEmployee does not have persistent attribute named FlightBenefit

@OneToMany(mappedBy = "FlightBenefit")
private Set<FulltimeEmployee> FulltimeEmployees;

Names of persistent attributes are case sensitive. Because attribute is flightBenefit (first character is lower case), name should be exactly same when used in mappedBy:

@OneToMany(mappedBy = "flightBenefit")

Additionally as warnings are telling, using Table annotation in subclass does not make sense with SINGLE_TABLE: they are persisted to single table so consequently table is same.

Answer to question after modification:

Now problem comes from:

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private String id;

That does not work, because there is no auto increment for String (varchar in database). That was also told in logs in following message: Incorrect column specifier for column 'id'. When feasible, use Integer/Long instead.

这篇关于Hibernate一对多映射错误 - mappedBy引用一个未知的目标实体属性错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆