简单的休眠映射问题

时间:2019-03-16 04:15:51

标签: java mysql hibernate jpa

我正在尝试完成一个简单的映射,但是遇到了问题。

我在Mysql中基本上是一个User表,其中只有一列,该列是名为Username的varchar(255),它是主键。

我还有另一个表叫做notes,它具有一个主自动生成键,它是一个int,一个date列,varchar名称和内容列以及一个{{1} },称为所有者,其中应包含用户的用户名。

这被标记为引用用户(用户名)的外键。

获取会话工厂的代码是这样的:

varchar(255)

在没有添加带注释的类'Note'的行的情况下,此方法可以正常工作,因此该类可能存在问题。错误是这样的:

无法获取以下对象的构造函数     org.hibernate.persister.entity.SingleTableEntityPersister     org.hibernate.MappingException

完整stacktrace

完整的类在这里可用:

Note

User

Test

更新:修复了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)   参考文献Ownerusers

Stacktrace

2 个答案:

答案 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);
   }