‘任务:
1.创建到数据库和架构的连接。启动应用程序。检查它是否完全工作。
1.创建一个带有String model和int series字段的Car实体,User将使用一对一关系引用这些字段。
1.将此类添加到休眠设置中。
1.用机器创建几个用户,将它们添加到数据库,然后将它们拉回来。
1.向服务中添加一个方法,该方法将使用HQL查询来获取拥有机器的用户(按其型号和系列)。
问题是,为我的一个朋友工作的代码只工作了一半
public static void main(String[] args) throws SQLException {
AnnotationConfigApplicationContext context =
new AnnotationConfigApplicationContext(AppConfig.class);
UserService userService = context.getBean(UserService.class);
User user1 = new User("User1", "Lastname1", "user1@mail.ru");
Car cfr1 = new Car("Mersedes", 1);
user1.setCar(cfr1);
userService.add(user1);
User user11 = new User("User2", "Lastname2", "user22@mail.ru");
Car cfr11 = new Car("BMW", 3);
user11.setCar(cfr11);
userService.add(user11);
List<User> users = userService.listUsers();
for (User user : users) {
System.out.println("Id = " + user.getId());
System.out.println("First Name = " + user.getFirstName());
System.out.println("Last Name = " + user.getLastName());
System.out.println("Email = " + user.getEmail());
System.out.println("Car = " + user.getCar());
System.out.println();
}
User user111 = userService.getUserByCar("BMW", 3);
System.out.println("Владелец машины по модели и серии - " + user111);
context.close();
}
这是主要的
this is the db.properties file
# MySQL properties
db.driver=com.mysql.cj.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/test
db.username=root
db.password=12345
# Hibernate properties
hibernate.show_sql=true
hibernate.hbm2ddl.auto=update
这是一个例外
信息:HHH000400:使用方言:org.hibernate.dialect.MySQL8Dialect Hibernate:alter table汽车add constraint FKqw4c8e6nqrvy3ti1xj8w8wyc9 foreign key(user_id)references users(id)作者。04,2023 12:34:17 AM org.hibernate.tool.schema.internal.ExceptionHandlerLoggedImpl handleException WARN:GenerationTarget遇到异常接受命令:通过JDBC语句org.hibernate.tool.schema.spi执行DDL“alter table汽车add constraint FKqw4c8e6nqrvy3ti1xj8w8wyc9 foreign key(user_id)references users(id)”时出错。CommandAcceptanceException:通过JDBC语句执行DDL“alter table汽车add constraint FKqw4c8e6nqrvy3ti1xj8w8wyc9 foreign key(user_id)references users(id)”时出错
应用程序配置
package hiber.config;
import hiber.model.Car;
import hiber.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.hibernate5.HibernateTransactionManager;
import org.springframework.orm.hibernate5.LocalSessionFactoryBean;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.sql.DataSource;
import java.util.Properties;
@Configuration
@PropertySource("classpath:db.properties")
@EnableTransactionManagement
@ComponentScan(value = "hiber")
public class AppConfig {
@Autowired
private Environment env;
@Bean
public DataSource getDataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(env.getProperty("db.driver"));
dataSource.setUrl(env.getProperty("db.url"));
dataSource.setUsername(env.getProperty("db.username"));
dataSource.setPassword(env.getProperty("db.password"));
return dataSource;
}
@Bean
public LocalSessionFactoryBean getSessionFactory() {
LocalSessionFactoryBean factoryBean = new LocalSessionFactoryBean();
factoryBean.setDataSource(getDataSource());
Properties props = new Properties();
props.put("hibernate.show_sql", env.getProperty("hibernate.show_sql"));
props.put("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto"));
factoryBean.setHibernateProperties(props);
factoryBean.setAnnotatedClasses(User.class, Car.class);
return factoryBean;
}
@Bean
public HibernateTransactionManager getTransactionManager() {
HibernateTransactionManager transactionManager = new HibernateTransactionManager();
transactionManager.setSessionFactory(getSessionFactory().getObject());
return transactionManager;
}
}
车辆等级
package hiber.model;
import javax.persistence.*;
@Entity
@Table(name = "cars")
public class Car {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "model")
private String model;
@Column(name = "series")
private int series;
@OneToOne
@JoinColumn(name = "user_id",referencedColumnName = "id")
private User user;
public Car(){
}
public Car(String model, int series) {
this.model = model;
this.series = series;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
public int getSeries() {
return series;
}
public void setSeries(int series) {
this.series = series;
}
public User getUser() {
return user;
}
public User setUser(User user) {
this.user = user;
return user;
}
@Override
public String toString() {
return "Car {" +
"id=" + id +
", model='" + model + '\'' +
", series=" + series +
'}';
}
}
类用户
package hiber.model;
import javax.persistence.*;
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "name")
private String firstName;
@Column(name = "last_name")
private String lastName;
@Column(name = "email")
private String email;
@OneToOne(mappedBy = "user")
private Car car;
public User() {}
public User(String firstName, String lastName, String email) {
this.firstName = firstName;
this.lastName = lastName;
this.email = email;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Car getCar(){return car;}
public Car setCar(Car car){
this.car =car;
return car;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", firstName='" + firstName + '\'' +
", lastName='" + lastName + '\'' +
", email='" + email + '\'' +
'}';
}
}
2条答案
按热度按时间s4chpxco1#
您的表的id和user_id列似乎由于某种原因具有不兼容的类型。请参考此问题以获取可能的答案:MySQL cannot create foreign key constraint
mwkjh3gx2#
在你的汽车实体中
并在用户实体中进行如下更改
如果问题仍然存在,请尝试删除数据库并创建一个新的数据库。然后运行该程序。