我正在尝试完成一个简单的映射,但是我有问题。
基本上我在MySQL中拥有的是一个用户表,只有一个列,即varchar(255)
名为用户名,它是主要键。
我有另一个名为Notes的表,该表具有一个主要的自动生成键,即int
,date
列,varchar
名称和内容列和一个称为所有者的varchar(255)
,该键应包含用户的用户名。
这被标记为外国密钥引用用户(用户名)。
获得会话工厂的代码是:
private static SessionFactory createSessionFactory() {
SessionFactory sessionFactory;
Configuration configuration = new Configuration();
configuration.configure("hibernate.cfg.xml");
configuration.addAnnotatedClass(Note.class);
configuration.addAnnotatedClass(User.class);
StandardServiceRegistry serviceRegistry = new
StandardServiceRegistryBuilder().applySettings(
configuration.getProperties()).build();
sessionFactory = configuration.buildSessionFactory(serviceRegistry);
return sessionFactory;
}
这可以正常工作,没有添加带注释的类"注释"的行,因此该类可能是一个问题。错误是:
无法获得构造函数 org.hibernate.persister.entity.singletentitypersister org.hibernate.mappingException
完整的堆栈:
完整的课程可在此处提供:
注意
用户
测试
更新:固定的所有者/ownername变量错误命名,但是我现在遇到此错误:
无法添加或更新子行:外键约束失败 (
notes
。notes
,约束notes_ibfk_1
外键(Owner
) 参考users
(username
))
stacktrace。
问题在Note类中。对于变量所有者,设置方法名称不合适。而不是
public void setOwnerName(String u) {
this.owner = u;
}
应该是
public void setOwner(String u) {
this.owner = u;
}
这应该解决问题。
您应该首先保存用户,然后在测试类中保存注释。您的代码应该是这样的。
@Test
public void testSave() {
Session session = factory.openSession();
Date date = Date.valueOf(LocalDate.now());
User user = new User("Joseph");
Note note = new Note();
note.setName("Joseph's note");
note.setContents("blah blah blah");
note.setOwnerName("Joseph");
session.beginTransaction();
session.save(user);
session.save(note);
session.getTransaction().commit();
session.close();
System.out.println(date);
}
但是,使用此代码,您只有数据库中的外键,而您的代码没有关系。您的注意事项可以像下面的代码一样。
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "username")
public String getOwner() {
return owner;
}
最后,您的测试类可能是:
@Test
public void testSave() {
Session session = factory.openSession();
Date date = Date.valueOf(LocalDate.now());
User user = new User("Joseph");
Note note = new Note();
note.setName("Joseph's note");
note.setContents("blah blah blah");
note.setOwner(user);
session.beginTransaction();
session.save(user);
session.save(note);
session.getTransaction().commit();
session.close();
System.out.println(date);
}