【问题标题】:JPA, Hibernate, postgreSQL: Unable to build Hibernate SessionFactoryJPA、Hibernate、postgreSQL:无法构建 Hibernate SessionFactory
【发布时间】:2015-05-19 02:13:46
【问题描述】:

我正在尝试使用 EJB、JPA-Hibernate 做一些示例应用程序。

我做了一个这样的 PostgreSQL 数据库:

CREATE TABLE Klasa (
idKlasa SERIAL,
Profil VARCHAR NULL,
Skrot VARCHAR NULL,
PRIMARY KEY(idKlasa)
);

CREATE TABLE Przedmiot (
 idPrzedmiot SERIAL,
idKlasa INTEGER  NOT NULL,
Nazwa VARCHAR NULL,
PRIMARY KEY(idPrzedmiot),
FOREIGN KEY (idKlasa) REFERENCES Klasa(idKlasa)
);

CREATE TABLE Uczen (
 idUczen SERIAL,
 idKlasa INTEGER  NOT NULL,
Imie VARCHAR NULL,
 Nazwisko VARCHAR NULL,
PRIMARY KEY(idUczen),
FOREIGN KEY (idKlasa) REFERENCES Klasa(idKlasa)
);

CREATE TABLE Ocena (
idUczen INTEGER  NOT NULL,
idPrzedmiot INTEGER  NOT NULL,
Ocena INTEGER  NULL,
PRIMARY KEY(idUczen, idPrzedmiot),
FOREIGN KEY (idUczen) REFERENCES Uczen(idUczen),
FOREIGN KEY (idPrzedmiot) REFERENCES Przedmiot(idPrzedmiot)
 );

然后我使用 EclipseLink 2.5 生成实体。

现在,我试图从 Klasa 表中获取任何记录。但是我在 WildFly 8.2 上部署时遇到了一些错误:

 20:38:11,089 ERROR [org.jboss.msc.service.fail] (ServerService Thread Pool -- 50) MSC000001: Failed to start service jboss.persistenceunit."Lab1.war#Lab1": org.jboss.msc.service.StartException in service jboss.persistenceunit."Lab1.war#Lab1": javax.persistence.PersistenceException: [PersistenceUnit: Lab1] Unable to build Hibernate SessionFactory
at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:172) [wildfly-jpa-8.2.0.Final.jar:8.2.0.Final]
at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:117) [wildfly-jpa-8.2.0.Final.jar:8.2.0.Final]
at java.security.AccessController.doPrivileged(Native Method) [rt.jar:1.8.0_40]
at org.wildfly.security.manager.WildFlySecurityManager.doChecked(WildFlySecurityManager.java:474)
at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1.run(PersistenceUnitServiceImpl.java:182) [wildfly-jpa-8.2.0.Final.jar:8.2.0.Final]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [rt.jar:1.8.0_40]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [rt.jar:1.8.0_40]
at java.lang.Thread.run(Thread.java:745) [rt.jar:1.8.0_40]
at org.jboss.threads.JBossThread.run(JBossThread.java:122)
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: Lab1] Unable to build Hibernate SessionFactory 

和:

20:38:11,089 ERROR [org.jboss.as.controller.management-operation] (Controller Boot Thread) JBAS014613: Operation ("deploy") failed - address: ([("deployment" => "Lab1.war")]) - failure description: {"JBAS014671: Failed services" => {"jboss.persistenceunit.\"Lab1.war#Lab1\"" => "org.jboss.msc.service.StartException in service jboss.persistenceunit.\"Lab1.war#Lab1\": javax.persistence.PersistenceException: [PersistenceUnit: Lab1] Unable to build Hibernate SessionFactory
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: Lab1] Unable to build Hibernate SessionFactory
Caused by: org.hibernate.MappingException: Repeated column in mapping for entity: pl.edu.wat.model.Ocena column: idprzedmiot (should be mapped with insert=\"false\" update=\"false\")"}}
20:38:11,089 WARN  [org.jboss.as.jpa] (Controller Boot Thread) JBAS011411: Unexpected problem gathering statistics: java.lang.IllegalStateException: JBAS011477: Persistence unit 'Lab1.war#Lab1' is not available

我不知道我做错了什么。我将发布persistance.xml 和Ocena Entity(因为上面有错误点)

persistance.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1"
xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="Lab1" transaction-type="JTA">
    <class>pl.edu.wat.model.Klasa</class>
    <class>pl.edu.wat.model.Ocena</class>
    <class>pl.edu.wat.model.OcenaPK</class>
    <class>pl.edu.wat.model.Przedmiot</class>
    <class>pl.edu.wat.model.Uczen</class>
    <properties>
        <property name="hibernate.connection.username" value="postgres" />
        <property name="hibernate.connection.password" value="postgres" />
        <property name="hibernate.connection.url" value="jdbc:postgresql://localhost:5432/Lab1" />
        <property name="hibernate.connection.driver_class" value="org.postgresql.Driver" />
        <property name="hibernate.show_sql" value="true" />
        <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
        <property name="hibernate.hbm2ddl.auto" value="validate" />

    </properties>

</persistence-unit>
</persistence>

Ocena.java

@Entity
@NamedQuery(name="Ocena.findAll", query="SELECT o FROM Ocena o")
public class Ocena implements Serializable {
private static final long serialVersionUID = 1L;

@EmbeddedId
private OcenaPK id;

private Integer ocena;

//bi-directional many-to-one association to Przedmiot
@ManyToOne
@JoinColumn(name="idprzedmiot")
private Przedmiot przedmiot;

//bi-directional many-to-one association to Uczen
@ManyToOne
@JoinColumn(name="iduczen")
private Uczen uczen;

public Ocena() {
}

public OcenaPK getId() {
    return this.id;
}

public void setId(OcenaPK id) {
    this.id = id;
}

public Integer getOcena() {
    return this.ocena;
}

public void setOcena(Integer ocena) {
    this.ocena = ocena;
}

public Przedmiot getPrzedmiot() {
    return this.przedmiot;
}

public void setPrzedmiot(Przedmiot przedmiot) {
    this.przedmiot = przedmiot;
}

public Uczen getUczen() {
    return this.uczen;
}

public void setUczen(Uczen uczen) {
    this.uczen = uczen;
}

}

更新

这里是关联的其他端。

Uczen.java

@Entity
@NamedQuery(name="Uczen.findAll", query="SELECT u FROM Uczen u")
public class Uczen implements Serializable {
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer iduczen;

private String imie;

private String nazwisko;

//bi-directional many-to-one association to Ocena
@OneToMany(mappedBy="uczen")
private List<Ocena> ocenas;

//bi-directional many-to-one association to Klasa
@ManyToOne
@JoinColumn(name="idklasa")
private Klasa klasa;

public Uczen() {
}

public Integer getIduczen() {
    return this.iduczen;
}

public void setIduczen(Integer iduczen) {
    this.iduczen = iduczen;
}

public String getImie() {
    return this.imie;
}

public void setImie(String imie) {
    this.imie = imie;
}

public String getNazwisko() {
    return this.nazwisko;
}

public void setNazwisko(String nazwisko) {
    this.nazwisko = nazwisko;
}

public List<Ocena> getOcenas() {
    return this.ocenas;
}

public void setOcenas(List<Ocena> ocenas) {
    this.ocenas = ocenas;
}

public Ocena addOcena(Ocena ocena) {
    getOcenas().add(ocena);
    ocena.setUczen(this);

    return ocena;
}

public Ocena removeOcena(Ocena ocena) {
    getOcenas().remove(ocena);
    ocena.setUczen(null);

    return ocena;
}

public Klasa getKlasa() {
    return this.klasa;
}

public void setKlasa(Klasa klasa) {
    this.klasa = klasa;
}

}

Przedmiot.java

@Entity
@NamedQuery(name="Przedmiot.findAll", query="SELECT p FROM Przedmiot p")
public class Przedmiot implements Serializable {
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer idprzedmiot;

private String nazwa;

//bi-directional many-to-one association to Ocena
@OneToMany(mappedBy="przedmiot")
private List<Ocena> ocenas;

//bi-directional many-to-one association to Klasa
@ManyToOne
@JoinColumn(name="idklasa")
private Klasa klasa;

public Przedmiot() {
}

public Integer getIdprzedmiot() {
    return this.idprzedmiot;
}

public void setIdprzedmiot(Integer idprzedmiot) {
    this.idprzedmiot = idprzedmiot;
}

public String getNazwa() {
    return this.nazwa;
}

public void setNazwa(String nazwa) {
    this.nazwa = nazwa;
}

public List<Ocena> getOcenas() {
    return this.ocenas;
}

public void setOcenas(List<Ocena> ocenas) {
    this.ocenas = ocenas;
}

public Ocena addOcena(Ocena ocena) {
    getOcenas().add(ocena);
    ocena.setPrzedmiot(this);

    return ocena;
}

public Ocena removeOcena(Ocena ocena) {
    getOcenas().remove(ocena);
    ocena.setPrzedmiot(null);

    return ocena;
}

public Klasa getKlasa() {
    return this.klasa;
}

public void setKlasa(Klasa klasa) {
    this.klasa = klasa;
}

}

【问题讨论】:

  • 'Repeated column in mapping for entity: pl.edu.wat.model.Ocena column' 我猜这是因为你将实体和字段命名为完全相同。
  • @RenéWinkler 不,我改变了,还是一样,错误指向 idprzedmiot,但仍然不知道为什么
  • 为什么不使用 hibernate 构建您的架构?
  • @NeilMcGuigan 你的意思是不是 EclipseLink 2.5?
  • @ilovkatie 是的,因为您无论如何都在使用休眠,为什么不使用它构建模式? eclipselink和hibernate有不同的命名规则

标签: java hibernate postgresql jpa wildfly


【解决方案1】:

您没有向我们展示您的Ocena 的双向关联的另一端,我怀疑这就是问题所在。

对于双向关联,一端是所有者,另一端必须使用映射注解中的mappedBy属性。

更新:mappedBy 属性看起来不错。你的OcenaPK 班级呢?它是否包含 idPrzedmiot 列的重复映射?

【讨论】:

  • 我添加了 2 个缺失的课程
猜你喜欢
  • 2016-09-20
  • 2018-08-03
  • 2018-03-22
  • 2017-04-10
  • 1970-01-01
  • 1970-01-01
  • 2018-07-25
  • 1970-01-01
  • 2021-06-29
相关资源
最近更新 更多