Hibernate 在 CommandLineRunner 中不起作用
Hibernate don't work in CommandLineRunner
我正在尝试制作一个简单的休眠应用程序,当我尝试 运行 它使用通常的 java class 它运行良好,但是当我尝试 运行 它使用 CommandLineRunner
使用 Spring 引导失败并出现错误
java.lang.IllegalStateException: Failed to execute CommandLineRunner
Caused by: org.hibernate.PropertyAccessException: Could not set field value [1] value by reflection : [class springboottest.entity.Item.id] setter of springboottest.entity.Item.id
Caused by: java.lang.IllegalArgumentException: Can not set int field springboottest.entity.Item.id to springboottest.entity.Item
当 session.save(item1);
执行时。
CommandLineRunner
效果很好,例如
@Service
public class DBInit implements CommandLineRunner
{
@Override
public void run(String[] args)
{
System.out.println("woring");
}
}
按预期打印“工作”。
如果 java
class 和 main()
一起使用,Hibernate
也能很好地工作,但是 Hibernate
在 run()
和 CommandLineRunner
中不起作用].
我在这里不使用 none of Spring Boot
特性,比如依赖注入或其他东西,只是简单的 java
代码。
那么为什么我有错误以及如何让它工作?
// don't working
@Service
public class DBInit implements CommandLineRunner
{
@Override
public void run(String[] args)
{
Configuration configuration = new Configuration().configure();
configuration.addAnnotatedClass(Item.class);
SessionFactory sessionFactory = configuration.buildSessionFactory();
try (Session session = sessionFactory.openSession())
{
Item item1 = new Item("itemName");
session.beginTransaction();
session.save(item1);
session.getTransaction().commit();
}
}
}
// working well
public class DBInit
{
public static void main(String[] args)
{
Configuration configuration = new Configuration().configure();
configuration.addAnnotatedClass(Item.class);
SessionFactory sessionFactory = configuration.buildSessionFactory();
try (Session session = sessionFactory.openSession())
{
Item item1 = new Item("itemName");
session.beginTransaction();
session.save(item1);
session.getTransaction().commit();
}
}
}
项目class
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import javax.persistence.*;
@Entity
@Table(name = "items")
@NoArgsConstructor
public class Item
{
@Id
@GeneratedValue
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column
@Getter
@Setter
private int id;
@Getter
@Setter
@Column(nullable = false)
private String name;
public Item(String name)
{
this.name = name;
}
}
hibernate.cfg.xml
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="http://www.hibernate.org/xsd/orm/cfg">
<session-factory>
<property name="connection.url">jdbc:postgresql://localhost:5432/postgres</property>
<property name="connection.driver_class">org.postgresql.Driver</property>
<property name="connection.username">postgres</property>
<property name="connection.password">123</property>
<property name="dialect">org.hibernate.dialect.PostgreSQL94Dialect</property>
<property name="show_sql">true</property>
<property name="hbm2ddl.auto">create</property>
<property name="format_sql">true</property>
<mapping class="springboottest.entity.Item"/>
</session-factory>
</hibernate-configuration>
该代码混合了“旧式”和 spring 启动。当 DBInit.main 在没有 spring 的情况下运行时,它会创建 SessionFactory
并且当 spring 启动时 CommandLineRunner 运行 spring 初始化 EntityManagerFactory
提供所有 sessions
之后。
区别在于“sessionFactory”使用“hibernate.cfg.xml”它已经有<mapping class="springboottest.entity.Item"/>
因此它按预期工作,但是EntityManagerFactory不使用hibernate.cfg.xml,所以映射坏了。查看 this 了解更多详情。
如何解决,对于spring你应该使用@Repository。 The blog 这是解决方案
package springboottest.entity;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface ItemRepository extends CrudRepository<Item, Integer> {
}
DBinit 服务应该如下所示
@Service
public class DBInit implements CommandLineRunner
{
@Autowired
ItemRepository repo;
@Override
public void run(String[] args)
{
System.out.println("CommandLineRunner run() executing...");
repo.save(new Item("ItemName"));
}
}
cfg xml 不是必需的,添加属性
spring.datasource.url=jdbc:postgresql://localhost:5432/postgres
spring.datasource.username=postgres
spring.datasource.password=123
spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
spring.jpa.properties.hibernate.format-sql=true
这将使 spring 正常工作。
公关:https://github.com/Denys-coder/Hibernate_dont_work_in_CommandLineRunner/pull/1
我正在尝试制作一个简单的休眠应用程序,当我尝试 运行 它使用通常的 java class 它运行良好,但是当我尝试 运行 它使用 CommandLineRunner
使用 Spring 引导失败并出现错误
java.lang.IllegalStateException: Failed to execute CommandLineRunner
Caused by: org.hibernate.PropertyAccessException: Could not set field value [1] value by reflection : [class springboottest.entity.Item.id] setter of springboottest.entity.Item.id
Caused by: java.lang.IllegalArgumentException: Can not set int field springboottest.entity.Item.id to springboottest.entity.Item
当 session.save(item1);
执行时。
CommandLineRunner
效果很好,例如
@Service
public class DBInit implements CommandLineRunner
{
@Override
public void run(String[] args)
{
System.out.println("woring");
}
}
按预期打印“工作”。
如果 java
class 和 main()
一起使用,Hibernate
也能很好地工作,但是 Hibernate
在 run()
和 CommandLineRunner
中不起作用].
我在这里不使用 none of Spring Boot
特性,比如依赖注入或其他东西,只是简单的 java
代码。
那么为什么我有错误以及如何让它工作?
// don't working
@Service
public class DBInit implements CommandLineRunner
{
@Override
public void run(String[] args)
{
Configuration configuration = new Configuration().configure();
configuration.addAnnotatedClass(Item.class);
SessionFactory sessionFactory = configuration.buildSessionFactory();
try (Session session = sessionFactory.openSession())
{
Item item1 = new Item("itemName");
session.beginTransaction();
session.save(item1);
session.getTransaction().commit();
}
}
}
// working well
public class DBInit
{
public static void main(String[] args)
{
Configuration configuration = new Configuration().configure();
configuration.addAnnotatedClass(Item.class);
SessionFactory sessionFactory = configuration.buildSessionFactory();
try (Session session = sessionFactory.openSession())
{
Item item1 = new Item("itemName");
session.beginTransaction();
session.save(item1);
session.getTransaction().commit();
}
}
}
项目class
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import javax.persistence.*;
@Entity
@Table(name = "items")
@NoArgsConstructor
public class Item
{
@Id
@GeneratedValue
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column
@Getter
@Setter
private int id;
@Getter
@Setter
@Column(nullable = false)
private String name;
public Item(String name)
{
this.name = name;
}
}
hibernate.cfg.xml
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="http://www.hibernate.org/xsd/orm/cfg">
<session-factory>
<property name="connection.url">jdbc:postgresql://localhost:5432/postgres</property>
<property name="connection.driver_class">org.postgresql.Driver</property>
<property name="connection.username">postgres</property>
<property name="connection.password">123</property>
<property name="dialect">org.hibernate.dialect.PostgreSQL94Dialect</property>
<property name="show_sql">true</property>
<property name="hbm2ddl.auto">create</property>
<property name="format_sql">true</property>
<mapping class="springboottest.entity.Item"/>
</session-factory>
</hibernate-configuration>
该代码混合了“旧式”和 spring 启动。当 DBInit.main 在没有 spring 的情况下运行时,它会创建 SessionFactory
并且当 spring 启动时 CommandLineRunner 运行 spring 初始化 EntityManagerFactory
提供所有 sessions
之后。
区别在于“sessionFactory”使用“hibernate.cfg.xml”它已经有<mapping class="springboottest.entity.Item"/>
因此它按预期工作,但是EntityManagerFactory不使用hibernate.cfg.xml,所以映射坏了。查看 this 了解更多详情。
如何解决,对于spring你应该使用@Repository。 The blog 这是解决方案
package springboottest.entity;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface ItemRepository extends CrudRepository<Item, Integer> {
}
DBinit 服务应该如下所示
@Service
public class DBInit implements CommandLineRunner
{
@Autowired
ItemRepository repo;
@Override
public void run(String[] args)
{
System.out.println("CommandLineRunner run() executing...");
repo.save(new Item("ItemName"));
}
}
cfg xml 不是必需的,添加属性
spring.datasource.url=jdbc:postgresql://localhost:5432/postgres
spring.datasource.username=postgres
spring.datasource.password=123
spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
spring.jpa.properties.hibernate.format-sql=true
这将使 spring 正常工作。
公关:https://github.com/Denys-coder/Hibernate_dont_work_in_CommandLineRunner/pull/1