Java Hibernate Annotation error java.lang.String



我目前正在尝试为数据库设置hibernate,但我遇到了这个问题,我已经尝试解决了大约4个小时。

错误:

Apr 27, 2021 8:22:26 AM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {5.4.0.Final}
Apr 27, 2021 8:22:26 AM org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
Apr 27, 2021 8:22:26 AM org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {5.1.0.Final}
Apr 27, 2021 8:22:26 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
WARN: HHH10001002: Using Hibernate built-in connection pool (not for production use!)
Apr 27, 2021 8:22:26 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001005: using driver [com.microsoft.sqlserver.jdbc.SQLServerDriver] at URL [jdbc:sqlserver://localhost:1434;DatabaseName=Chatbot]
Apr 27, 2021 8:22:26 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001001: Connection properties: {password=****, user=sa}
Apr 27, 2021 8:22:26 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001003: Autocommit mode: false
Apr 27, 2021 8:22:26 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections <init>
INFO: HHH000115: Hibernate connection pool size: 20 (min=1)
Apr 27, 2021 8:22:26 AM org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.SQLServerDialect
org.hibernate.AnnotationException: @OneToOne or @ManyToOne on backend.classes.Result.answer references an unknown entity: java.lang.String
at org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.java:97)
at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processEndOfQueue(InFlightMetadataCollectorImpl.java:1815)
at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processFkSecondPassesInOrder(InFlightMetadataCollectorImpl.java:1759)
at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1646)
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:287)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:903)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:934)
at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:56)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:79)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54)
at backend.classes.DBConnector.setUp(DBConnector.java:28)
at backend.classes.DBConnector.run(DBConnector.java:18)
at backend.classes.DBConnector.main(DBConnector.java:13)

我的数据类:

package backend.classes;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;
@Entity
@Table(name = "dbo.AntwortUndTag")
public class Result {
int id;
String answer;
String tag;
int tagUpvotes;
int tagDownvotes;
int tagUsages;
@Id
@Column(name = "antwortUndTagID")
@GeneratedValue(strategy = GenerationType.AUTO)
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "antwort")
public String getAnswer() {
return answer;
}
public void setAnswer(String answer) {
this.answer = answer;
}
@OneToOne(cascade = CascadeType.ALL)
public String getTag() {
return tag;
}
public void setTag(String tag) {
this.tag = tag;
}

public int getTagUpvotes() {
return tagUpvotes;
}
public void setTagUpvotes(int tagUpvotes) {
this.tagUpvotes = tagUpvotes;
}
public int getTagDownvotes() {
return tagDownvotes;
}
public void setTagDownvotes(int tagDownvotes) {
this.tagDownvotes = tagDownvotes;
}
@Column(name = "anzahlTagVerwendung")
public int getTagUsages() {
return tagUsages;
}
public void setTagUsages(int tagUsages) {
this.tagUsages = tagUsages;
}
public Result(int id, String answer, String tag, int tagUpvotes, int tagDownvotes, int tagUsages) {
super();
this.id = id;
this.answer = answer;
this.tag = tag;
this.tagUpvotes = tagUpvotes;
this.tagDownvotes = tagDownvotes;
this.tagUsages = tagUsages;
}
public Result() {
}
@Override
public String toString() {
return "Result [id=" + id + ", answer=" + answer + ", tag=" + tag + ", tagUpvotes=" + tagUpvotes
+ ", tagDownvotes=" + tagDownvotes + ", tagUsages=" + tagUsages + "]";
}
}

我的持久性.xml:

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
<persistence-unit name="chatbot">
<description>
Persistence Unit for the Chatbot
</description>

<class>java.lang.String</class>
<class>backend.classes.Result</class>

<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="javax.persistence.jdbc.url" value="jdbc:sqlserver://localhost:1434;DatabaseName=Chatbot" />
<property name="javax.persistence.jdbc.user" value="****" />
<property name="javax.persistence.jdbc.password" value="****" />
<property name="javax.persistence.jdbc.driver" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" />
<property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.hbm2ddl.auto" value="create" />
</properties>
</persistence-unit>
</persistence>

我的演示类测试我的连接:

package backend.classes;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
public class DBConnector {
private EntityManagerFactory entityManagerFactory;

public static void main(String[] args) {
new DBConnector().run();
}
void run() {
try {
setUp();
testBasicUsage();
tearDown();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void setUp() throws Exception {
entityManagerFactory = Persistence.createEntityManagerFactory("chatbot");
}
public void tearDown() throws Exception {
entityManagerFactory.close();
}
public void testBasicUsage() {
EntityManager em = entityManagerFactory.createEntityManager();
em.getTransaction().begin();

List<Result> result = em.createQuery( "from dbo.AntwortUndTag", Result.class ).getResultList();
for ( Result r : result ) {
System.out.println(r.toString());
}

em.getTransaction().commit();
em.close();
}
}

我的数据库如下所示:数据库ORM

从两个外键,我试图获得"antwort"字符串

我已经尝试在persistence.xml 中添加类"Result"one_answers"String">

关联需要关联到其他实体(或嵌入对象(。错误会告诉你出了什么问题:你试图将一对一与Result.answer中的String相关联。

您需要做的是将所有三个表映射为实体:

@Entity
@Table(name = "Antworten")
class Antwort {
...
}
@Entity
@Table(name = "AntwortUndTag")
class Result {
...
}

@Entity
@Table(name = "Tags")
class Tag {
...
}

现在您可以在Result:中创建关联

@Entity
@Table(name = "AntwortUndTag")
class Result {
@ManyToOne
@JoinColumn(name="antwortID")
Antwort answer;
@ManyToOne
@JoinColumn(name="tagID")
Tag tag;
}

注意,我使用了@ManyToOne,因为从图中可以看出,一个答案可能有多个标签。

您可以在Hibernate ORM文档中找到许多关于如何映射关联的示例。具体请参见示例172。带有链接实体的双向多对多。这似乎就是你需要的映射。

相关内容

最新更新