Java JPA、Hibernate、postgreSQL:无法构建Hibernate SessionFactory

Java JPA、Hibernate、postgreSQL:无法构建Hibernate SessionFactory,java,hibernate,postgresql,jpa,wildfly,Java,Hibernate,Postgresql,Jpa,Wildfly,我想用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

我想用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 
以及:

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

persistence.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>
更新

这里是协会的其他目的

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;
}

}
@实体
@NamedQuery(name=“Uczen.findAll”,query=“从Uczen u中选择u”)
公共类Uczen实现了可序列化{
私有静态最终长serialVersionUID=1L;
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私有整数iduczen;
私有字符串imie;
私人字符串纳兹维斯科;
//与Ocena的双向多对一关联
@OneToMany(mappedBy=“uczen”)
私人名单;
//到Klasa的双向多对一关联
@许多酮
@JoinColumn(name=“idklasa”)
私人科拉萨·科拉萨;
公共Uczen(){
}
公共整数getIduczen(){
返回此.iduczen;
}
公共void setIduczen(整数iduczen){
this.iduczen=iduczen;
}
公共字符串getImie(){
返回此.imie;
}
public void setImie(字符串imie){
this.imie=imie;
}
公共字符串getNazwisko(){
把这个还给纳兹维斯科;
}
公共无效setNazwisko(字符串nazwisko){
this.nazwisko=nazwisko;
}
公共列表getOcenas(){
返回此文件。ocenas;
}
公共无效setOcenas(列出ocenas){
this.ocenas=ocenas;
}
公共斗牛士(斗牛士){
getOcenas().add(ocena);
西土曾(本);
回盲;
}
公共斗牛士移除斗牛士(斗牛士){
getOcenas().remove(ocena);
ocena.setUczen(空);
回盲;
}
公共Klasa getKlasa(){
归还这个.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;
}

}
@实体
@NamedQuery(name=“Przedmiot.findAll”,query=“从Przedmiot p中选择p”)
公共类Przedmiot实现可序列化{
私有静态最终长serialVersionUID=1L;
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私有整数idprzedmiot;
私有字符串nazwa;
//与Ocena的双向多对一关联
@OneToMany(mappedBy=“przedmiot”)
私人名单;
//到Klasa的双向多对一关联
@许多酮
@JoinColumn(name=“idklasa”)
私人科拉萨·科拉萨;
公共Przedmiot(){
}
公共整数getIdprzedmiot(){
返回此.idprzedmiot;
}
公共无效集合idprzedmiot(整数idprzedmiot){
this.idprzedmiot=idprzedmiot;
}
公共字符串getNazwa(){
把这个还给我;
}
公共无效setNazwa(字符串nazwa){
this.nazwa=nazwa;
}
公共列表getOcenas(){
返回此文件。ocenas;
}
公共无效setOcenas(列出ocenas){
this.ocenas=ocenas;
}
公共斗牛士(斗牛士){
getOcenas().add(ocena);
ocena.setPrzedmiot(本);
回盲;
}
公共斗牛士移除斗牛士(斗牛士){
getOcenas().remove(ocena);
ocena.setPrzedmiot(空);
回盲;
}
公共Klasa getKlasa(){
归还这个.klasa;
}
塞特克拉萨公共空间(克拉萨-克拉萨){
this.klasa=klasa;
}
}

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

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


更新:映射属性看起来正常。你的
OcenaPK
课程怎么样?它是否包含
idPrzedmiot
列的重复映射?

'Repeated column in mapping for entity:pl.edu.wat.model.Ocena column'我猜这是因为您对实体和字段的命名完全相同。@RenéWinkler没有,我更改了,仍然相同,错误指向idPrzedmiot,但是仍然不知道为什么不使用hibernate构建模式?@NeilMcGuigan你的意思是代替EclipseLink 2.5吗?@ilovkatie是的,既然你正在使用hibernate,为什么不使用它构建模式呢?eclipselink和hibernate有不同的命名规则。我添加了两个缺少的类
@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;
}

}
@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;
}

}