Hibernate i zapis do bazy

Hibernate i zapis do bazy
RY
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 101
0

Witam
Tworzę aplikację web z wykorzystaniem architektury REST w technologiach Spring 3.2, Hibernate 3.6. Próbuje wykonać banalny zapis pojedynczej encji do bazy, która w zaskakujący sposób sprawia mi problem (tylko ta, reszta działa mi poprawnie). Mam dwie encji Worker oraz Role w zależności jeden-do-wielu. Moje obiekty wyglądają następująco:

Kopiuj
@Entity
@Table(name = "worker", catalog = "schedule")
public class Worker implements java.io.Serializable {

	private static final long serialVersionUID = -5285909515638832506L;
	private Integer idWorker;
	private Role role;
	private String name;
	private String surname;
	private Integer phone;
	private Float salary;
	private String desc;
	private Set<Timeday> timedays = new HashSet<Timeday>(0);
	private Set<Order> orders = new HashSet<Order>(0);
	private Set<Timeweek> timeweeks = new HashSet<Timeweek>(0);

	public Worker() {
	}

	public Worker(Role role) {
		this.role = role;
	}

	public Worker(Role role, String name, String surname, Integer phone,
			Float salary, String desc, Set<Timeday> timedays, Set<Order> orders, Set<Timeweek> timeweeks) {
		this.role = role;
		this.name = name;
		this.surname = surname;
		this.phone = phone;
		this.salary = salary;
		this.desc = desc;
		this.timedays = timedays;
		this.orders = orders;
		this.timeweeks = timeweeks;
	}

	public Worker(WorkerDTO workerDto) {
		this.idWorker = workerDto.getIdWorker();
		this.name = workerDto.getName();
		this.surname = workerDto.getSurname();
		this.phone = workerDto.getPhone();
		this.salary = workerDto.getSalary();
		this.desc = workerDto.getDesc();
	}

	@Id
	@GeneratedValue(strategy = IDENTITY)
	@Column(name = "idWorker", unique = true, nullable = false)
	public Integer getIdWorker() {
		return this.idWorker;
	}

	public void setIdWorker(Integer idWorker) {
		this.idWorker = idWorker;
	}

	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "idRole", nullable = false)
	public Role getRole() {
		return this.role;
	}

	public void setRole(Role role) {
		this.role = role;
	}

	@Column(name = "Name", length = 45)
	public String getName() {
		return this.name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Column(name = "Surname", length = 45)
	public String getSurname() {
		return this.surname;
	}

	public void setSurname(String surname) {
		this.surname = surname;
	}

	@Column(name = "Phone")
	public Integer getPhone() {
		return this.phone;
	}

	public void setPhone(Integer phone) {
		this.phone = phone;
	}

	@Column(name = "Salary")
	public Float getSalary() {
		return this.salary;
	}

	public void setSalary(Float salary) {
		this.salary = salary;
	}
	
	@Column(name = "Desc", length = 100)
	public String getDesc() {
		return desc;
	}

	public void setDesc(String desc) {
		this.desc = desc;
	}

	@JsonIgnore
	@OneToMany(fetch = FetchType.LAZY, mappedBy = "worker")
	public Set<Timeday> getTimedays() {
		return this.timedays;
	}

	public void setTimedays(Set<Timeday> timedays) {
		this.timedays = timedays;
	}

	@JsonIgnore
	@OneToMany(fetch = FetchType.LAZY, mappedBy = "worker")
	public Set<Order> getOrders() {
		return this.orders;
	}

	public void setOrders(Set<Order> orders) {
		this.orders = orders;
	}

	@JsonIgnore
	@OneToMany(fetch = FetchType.LAZY, mappedBy = "worker")
	public Set<Timeweek> getTimeweeks() {
		return this.timeweeks;
	}

	public void setTimeweeks(Set<Timeweek> timeweeks) {
		this.timeweeks = timeweeks;
	}

}
Kopiuj
@Entity
@Table(name = "role", catalog = "schedule")
public class Role implements java.io.Serializable {

	private static final long serialVersionUID = -6681196270422194217L;
	private Integer idRole;
	private String name;
	private Set<Worker> workers = new HashSet<Worker>(0);
	private Set<Requestroles> requestroleses = new HashSet<Requestroles>(0);

	public Role() {
	}

	public Role(String name, Set<Worker> workers, Set<Requestroles> requestroleses) {
		this.name = name;
		this.workers = workers;
		this.requestroleses = requestroleses;
	}

	@Id
	@GeneratedValue(strategy = IDENTITY)
	@Column(name = "idRole", unique = true, nullable = false)
	public Integer getIdRole() {
		return this.idRole;
	}

	public void setIdRole(Integer idRole) {
		this.idRole = idRole;
	}

	@Column(name = "Name", length = 45)
	public String getName() {
		return this.name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@JsonBackReference
	@OneToMany(fetch = FetchType.EAGER, mappedBy = "role")
	public Set<Worker> getWorkers() {
		return this.workers;
	}

	public void setWorkers(Set<Worker> workers) {
		this.workers = workers;
	}

	@JsonIgnore
	@OneToMany(fetch = FetchType.LAZY, mappedBy = "role")
	public Set<Requestroles> getRequestroleses() {
		return this.requestroleses;
	}

	public void setRequestroleses(Set<Requestroles> requestroleses) {
		this.requestroleses = requestroleses;
	}

}

Moja metoda w API REST wygląda następująco:

Kopiuj
@ResponseBody
	@RequestMapping(value="/workers/new", method = RequestMethod.POST, produces = "application/json", consumes = "application/json")
	@ResponseStatus(HttpStatus.NO_CONTENT)
	public String saveWorker(@RequestBody @Valid WorkerDTO workerDto) {
		Worker worker = new Worker(workerDto);
		Role role = dbService.getRole(workerDto.getRole().getName());
		worker.setRole(role);
		dbService.saveWorker(worker);
		return "saved";
	}

Niby wszystko OK ALE dostaję błąd;)

Kopiuj
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Desc, Name, Phone, idRole, Salary, Surname) values ('asdsad', 'asas', 23232, 3, ' at line 1
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
	at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
	at com.mysql.jdbc.Util.getInstance(Util.java:381)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1030)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3491)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3423)
	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1936)
	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2060)
	at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2542)
	at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1734)
	at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2019)
	at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1937)
	at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1922)
	at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:93)
	at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:56)
	at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2346)
	at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2853)
	at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:71)
	at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:273)
	at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:320)
	at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:203)
	at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:129)
	at org.hibernate.event.def.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:201)
	at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:147)
	at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:71)
	at org.hibernate.impl.SessionImpl.firePersist(SessionImpl.java:808)
	at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:782)
	at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:786)
	at org.schedule.database.repository.impl.GenericDAOImpl.save(GenericDAOImpl.java:29)
	at org.schedule.database.facade.DatabaseServiceImpl.saveWorker(DatabaseServiceImpl.java:47)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:601)
	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
	at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:96)
	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:260)
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
	at com.sun.proxy.$Proxy222.saveWorker(Unknown Source)
	at org.schedule.service.rest.WorkersController.saveWorker(WorkersController.java:49)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:601)
	at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:219)
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:686)
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:838)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:688)
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:770)
	at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1550)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:343)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
	at org.schedule.service.filters.CorsFilter.doFilterInternal(CorsFilter.java:22)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161)
	at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
	at com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317)
	at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195)
	at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860)
	at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757)
	at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056)
	at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229)
	at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
	at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
	at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
	at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
	at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
	at java.lang.Thread.run(Thread.java:722)

Próbowałem skonfigurować glassfisha aby logował mi sql które idą do bazy, kierowałem się tym tutorialem:
https://wikis.oracle.com/display/GlassFish/Detailed+Logging+Output+with+GlassFish+Server,+Hibernate,+and+Log4j

Ale niestety nie działa mi logowanie zapytań. Wrzuciłem wszystkie wymagane pliki do glassfish/lib zmieniłam ustawienia w DriverManagerDataSource konfiguracji springa oraz stworzyłem plik log4j.properties. Proszę o jakiekolwiek porady.

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
0

Log błędu wskazuje na błędną konfiguracje hibernate. Pokaż context gdzie to konfigurujesz. Jesteś pewien ze ustawiłes poprawnie sql syntax konfigurując hibernate?

RY
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 101
0
Kopiuj
<!DOCTYPE hibernate-configuration PUBLIC
		"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
		"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory name="ScheduleDB">
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.password">******</property>
        <property name="hibernate.connection.username">******</property>
        <property name="hibernate.default_schema">schedule</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    </session-factory>
</hibernate-configuration>

Oraz konfiguracja springadb:

Kopiuj
@Configuration
@ComponentScan(basePackages = "org.schedule.database")
@EnableWebMvc
@EnableTransactionManagement
public class DatabaseSpringConfig extends WebMvcConfigurerAdapter {

	@Bean
	public static DriverManagerDataSource getDataSource() {
		DriverManagerDataSource myDataSource = new DriverManagerDataSource();
		myDataSource.setDriverClassName("com.mysql.jdbc.Driver");
		myDataSource.setUrl("jdbc:mysql://localhost:3306/schedule?zeroDateTimeBehavior=convertToNull");
		myDataSource.setUsername("*****");
		myDataSource.setPassword("*****");
		return myDataSource;
	}
	
	@Bean
	public SessionFactory getSessionFactory() throws Exception{
		Properties properties = new Properties();
		properties.put("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
		properties.put("hibernate.show_sql", "true");
		
		AnnotationSessionFactoryBean factory = new AnnotationSessionFactoryBean();
		factory.setAnnotatedClasses(new Class[]{Worker.class, Order.class, Timeweek.class, Role.class, Address.class, Opentime.class, Request.class, Requestroles.class, Timeday.class, Shop.class});
		factory.setDataSource(getDataSource());
		factory.setHibernateProperties(properties);
		factory.afterPropertiesSet();
		return factory.getObject();
	}

	@Bean
	public HibernateTransactionManager transactionManager() throws Exception {
		HibernateTransactionManager man = new HibernateTransactionManager();
		man.setSessionFactory(getSessionFactory());
		return man;
	}

}
RY
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 101
0

MySql wersja 5.5. Ale nie sadzę żeby w tym tkwił problem, ponieważ mam zaimplementowane funkcjonalności które insertują dane do bazy, i działają one poprawnie. Format danych też jest dobry.

RY
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 101
0

Zmieniłem wersje dialektu ale dalej dostaję ten sam błąd

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.