Java Hibernate OneToOne异常映射错误?
Java Hibernate OneToOne Exception Mapping Error?
我有以下classes
@Entity
@Table(name = "seek")
public class Seek implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@NotNull
@Valid
@OneToOne(mappedBy="url")
private Url url;
}
@Entity
@Table(name = "url")
public class Url implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "idSeek", referencedColumnName = "id")
private Seek seek;
}
我的Urltable有idSeek列,我的Seektable与urltable没有任何关系列。
我收到的异常是:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'seekDao': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.hibernate.SessionFactory dao.hibernate.AbstractDao.sessionFactory; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [configuration/HibernateConfig.class]: Invocation of init method failed; nested exception is org.hibernate.AnnotationException: Referenced property not a (One|Many)ToOne: model.Url.url in mappedBy of model.Seek.url
我的 DAO 刚刚扩展
public abstract class AbstractDao<PK extends Serializable, T> {
private final Class<T> persistentClass;
public AbstractDao() {
this.persistentClass = (Class<T>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[1];
}
@Autowired
private SessionFactory sessionFactory;
protected Session getSession() {
return this.sessionFactory.getCurrentSession();
}
public T getByKey(PK key) {
return (T) this.getSession().get(this.persistentClass, key);
}
public T getByColumn(String column, String value) {
Criteria criteria = this.getSession().createCriteria(this.persistentClass);
return (T) criteria.add(Restrictions.eq(column, value)).uniqueResult();
}
public void persist(T entity) {
this.getSession().persist(entity);
}
public void delete(T entity) {
this.getSession().delete(entity);
}
protected Criteria createEntityCriteria() {
return this.getSession().createCriteria(this.persistentClass);
}
protected Query getQuery(String query) {
return this.getSession().createQuery(query);
}
}
那样
@Repository("seekDao")
public class SeekDaoImpl extends AbstractDao<Integer, Seek> implements SeekDao {
@Override
public Seek get(int id) {
return super.getByKey(id);
}
@Override
public void save(Seek seek) {
super.persist(seek);
}
}
对Hibernate了解不多,问题出在哪里?
已编辑
我做到了,现在编译但现在我收到这个:警告:SQL错误:1048,SQL状态:23000
错误:列 'idSeek' 不能为空
我的服务方法class是:
// my service is @Transactional
@Override
public void saveSeek(Seek seek)
{
this.seekDao.save(seek);
this.urldao.save(seek.getUrl());//the url is inside the seek obj
}
所以我需要手动获取插入 ID 并放入我的 url obj?
谢谢
您的搜索 class 没有指向正确的 mappedBy
属性。
@Entity
@Table(name = "seek")
public class Seek implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@NotNull
@Valid
@OneToOne(mappedBy="seek")
private Url url;
}
尝试将 @OneToOne(mappedBy="url")
更改为 @OneToOne(mappedBy="seek")
我有以下classes
@Entity
@Table(name = "seek")
public class Seek implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@NotNull
@Valid
@OneToOne(mappedBy="url")
private Url url;
}
@Entity
@Table(name = "url")
public class Url implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "idSeek", referencedColumnName = "id")
private Seek seek;
}
我的Urltable有idSeek列,我的Seektable与urltable没有任何关系列。
我收到的异常是:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'seekDao': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.hibernate.SessionFactory dao.hibernate.AbstractDao.sessionFactory; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [configuration/HibernateConfig.class]: Invocation of init method failed; nested exception is org.hibernate.AnnotationException: Referenced property not a (One|Many)ToOne: model.Url.url in mappedBy of model.Seek.url
我的 DAO 刚刚扩展
public abstract class AbstractDao<PK extends Serializable, T> {
private final Class<T> persistentClass;
public AbstractDao() {
this.persistentClass = (Class<T>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[1];
}
@Autowired
private SessionFactory sessionFactory;
protected Session getSession() {
return this.sessionFactory.getCurrentSession();
}
public T getByKey(PK key) {
return (T) this.getSession().get(this.persistentClass, key);
}
public T getByColumn(String column, String value) {
Criteria criteria = this.getSession().createCriteria(this.persistentClass);
return (T) criteria.add(Restrictions.eq(column, value)).uniqueResult();
}
public void persist(T entity) {
this.getSession().persist(entity);
}
public void delete(T entity) {
this.getSession().delete(entity);
}
protected Criteria createEntityCriteria() {
return this.getSession().createCriteria(this.persistentClass);
}
protected Query getQuery(String query) {
return this.getSession().createQuery(query);
}
}
那样
@Repository("seekDao")
public class SeekDaoImpl extends AbstractDao<Integer, Seek> implements SeekDao {
@Override
public Seek get(int id) {
return super.getByKey(id);
}
@Override
public void save(Seek seek) {
super.persist(seek);
}
}
对Hibernate了解不多,问题出在哪里?
已编辑
我做到了,现在编译但现在我收到这个:警告:SQL错误:1048,SQL状态:23000 错误:列 'idSeek' 不能为空
我的服务方法class是:
// my service is @Transactional
@Override
public void saveSeek(Seek seek)
{
this.seekDao.save(seek);
this.urldao.save(seek.getUrl());//the url is inside the seek obj
}
所以我需要手动获取插入 ID 并放入我的 url obj? 谢谢
您的搜索 class 没有指向正确的 mappedBy
属性。
@Entity
@Table(name = "seek")
public class Seek implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@NotNull
@Valid
@OneToOne(mappedBy="seek")
private Url url;
}
尝试将 @OneToOne(mappedBy="url")
更改为 @OneToOne(mappedBy="seek")