2016-07-11 10 views
0

Ich habe die FolgeklassenJava Hibernate OneToOne Exception Mapping Fehler?

@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; 

} 

Meine URL Tabelle die idSeek Spalte hat, meinen Tisch Suche hat keine Beziehung Spalte mit URL-Tabelle.

Die Ausnahme, die ich erhalten ist:

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 

Mein DAOs verlängern nur

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); 
} 

}

wie die

@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); 
    } 
} 

Ich weiß nicht viel über Winterschlaf, wh Hier ist das Problem?

EDITED

Ich habe es getan, und stellt nun aber jetzt erhalte ich folgendes: WARNEN: SQL-Fehler: 1048, SQLState: 23000 ERROR: Spalte 'idSeek'

Meine Methode nicht null sein kann bei Serviceklasse ist:

// 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 
} 

Also muss ich die Einfüge-ID manuell abrufen und auf meine URL Obj? danke

+0

Ändern Ich glaube, Sie zu '@OneToOne ändern müssen (mappedBy =„suchen“)' zu Ihrer Sucht-Klasse für die URL-Eigenschaft. – Apostolos

+0

Vielleicht 'mappedBy =" suchen "'? – Seelenvirtuose

+0

Ich erhalte die: WARN: SQL Fehler: 1048, SQLState: 23000 FEHLER: Spalte 'idSeek' kann nicht null sein, wenn ich versuche, meine Modelle zu speichern ... Meine Frage wurde geändert, nach dem Wort EDITED ... –

Antwort

2

Ihre Seek-Klasse zeigt nicht auf die richtige mappedBy Eigenschaft.

@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; 

} 
+0

danke, Ich habe das getan, aber jetzt habe ich andere Zweifel ... Können Sie mir helfen? –

+0

Ja, was sind die anderen Zweifel? – Apostolos

+0

Ich erhalte die: WARN: SQL Fehler: 1048, SQLState: 23000 FEHLER: Spalte 'IDSeek' kann nicht null sein, wenn ich versuche, meine Modelle zu speichern ... Meine Frage wurde geändert, nach dem Wort EDITED ... –

0

Versuchen @OneToOne(mappedBy="url")-@OneToOne(mappedBy="seek")

+0

Können Sie bitte ein wenig mehr erklären. Welchen Einfluss könnte Ihre Änderung auf das Problem haben? – Jeet

+0

Das Attribut mappedBy ist nur für eine bidirektionale Beziehung erforderlich, dieses Element kann in der Anmerkung weggelassen werden ... –

+0

Danke, das habe ich getan, aber jetzt habe ich andere Zweifel ... Können Sie mir helfen? –