我正在尝试完成一个简单的映射,但是遇到了问题。
我在Mysql中基本上是一个User表,其中只有一列,该列是名为Username的varchar(255)
,它是主键。
我还有另一个表叫做notes,它具有一个主自动生成键,它是一个int
,一个date
列,varchar
名称和内容列以及一个{{1} },称为所有者,其中应包含用户的用户名。
这被标记为引用用户(用户名)的外键。
获取会话工厂的代码是这样的:
varchar(255)
在没有添加带注释的类'Note'的行的情况下,此方法可以正常工作,因此该类可能存在问题。错误是这样的:
无法获取以下对象的构造函数 org.hibernate.persister.entity.SingleTableEntityPersister org.hibernate.MappingException
完整stacktrace:
完整的类在这里可用:
更新:修复了Owner / OwnerName变量的错误命名,但是我现在看到此错误:错误:
无法添加或更新子行:外键约束失败 ({
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; }
。notes
,约束notes
外部密钥(notes_ibfk_1
) 参考文献Owner
(users
)
答案 0 :(得分:1)
问题在Note类中。 对于变量所有者,setter方法名称不正确。 代替
public void setOwnerName(String u) {
this.owner = u;
}
应该是
public void setOwner(String u) {
this.owner = u;
}
这应该可以解决问题。
答案 1 :(得分:1)
您应该首先保存用户,然后在测试课程中保存注释。 您的代码应该是这样的。
@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);
}