首先有2个表:
address(id,city,ref_id)
customer(id,name,address_id)
此处我customer一对一关联address的ref_id字段。而不关联address主键id
下面是源代码
@Entity
@Table(name = "address")
public class Address implements Serializable {
private int id;
private String city;
private int ref_id;
private Customer customer; @Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getCity() {
return city;
} public void setCity(String city) {
this.city = city;
} @Column(nullable=false,name="ref_id")
public int getRef_id() {
return ref_id;
} public void setRef_id(int ref_id) {
this.ref_id = ref_id;
} @OneToOne(mappedBy = "address")
public Customer getCustomer() {
return customer;
} public void setCustomer(Customer customer) {
this.customer = customer;
}
}@Entity
@Table(name = "customer")
public class Customer {
private int id;
private String name;
private Address address; @Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} @OneToOne
@JoinColumn(name = "address_id", referencedColumnName = "ref_id")
public Address getAddress() {
return address;
} public void setAddress(Address address) {
this.address = address;
}
}
其中address类实现了Serializable接口;
但是报错了:
public class Demo {
public static void main(String[] args) {
EntityManager em = Factory.getEntityManager(); Address address=em.find(Address.class, 1);

em.close();
}
}
Hibernate: select address0_.id as id1_1_, address0_.city as city1_1_, address0_.ref_id as ref3_1_1_, customer1_.id as id0_0_, customer1_.address_id as address3_0_0_, customer1_.name as name0_0_ from address address0_ left outer join customer customer1_ on address0_.id=customer1_.address_id where address0_.id=?
Hibernate: select address0_.id as id1_1_, address0_.city as city1_1_, address0_.ref_id as ref3_1_1_, customer1_.id as id0_0_, customer1_.address_id as address3_0_0_, customer1_.name as name0_0_ from address address0_ left outer join customer customer1_ on address0_.id=customer1_.address_id where address0_.ref_id=?
Exception in thread "main" javax.persistence.PersistenceException: org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of Address.ref_id
at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:630)
at org.hibernate.ejb.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:195)
at Demo.main(Demo.java:9)
Caused by: org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of Address.ref_id
at org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:171)
at org.hibernate.tuple.component.AbstractComponentTuplizer.getPropertyValue(AbstractComponentTuplizer.java:64)
at org.hibernate.tuple.component.AbstractComponentTuplizer.getPropertyValues(AbstractComponentTuplizer.java:70)
at org.hibernate.tuple.component.PojoComponentTuplizer.getPropertyValues(PojoComponentTuplizer.java:86)
at org.hibernate.type.ComponentType.getPropertyValues(ComponentType.java:353)
at org.hibernate.type.ComponentType.getHashCode(ComponentType.java:184)
at org.hibernate.engine.EntityUniqueKey.generateHashCode(EntityUniqueKey.java:63)
at org.hibernate.engine.EntityUniqueKey.<init>(EntityUniqueKey.java:44)
at org.hibernate.type.EntityType.loadByUniqueKey(EntityType.java:596)
at org.hibernate.type.EntityType.resolve(EntityType.java:382)
at org.hibernate.engine.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:116)
at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:854)
at org.hibernate.loader.Loader.doQuery(Loader.java:729)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
at org.hibernate.loader.Loader.loadEntity(Loader.java:1860)
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:48)
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:42)
at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:3044)
at org.hibernate.event.def.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:395)
at org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:375)
at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:139)
at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:195)
at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:103)
at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:878)
at org.hibernate.impl.SessionImpl.get(SessionImpl.java:815)
at org.hibernate.impl.SessionImpl.get(SessionImpl.java:808)
at org.hibernate.ejb.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:175)
... 1 more
Caused by: java.lang.IllegalArgumentException: object is not an instance of declaring class
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:145)
... 27 more希望告诉指点下: