我试图用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;
}
}
答案 0 :(得分:0)
您没有向我们展示您Ocena
的双向关联的另一端,我怀疑问题出在哪里。
对于双向关联,一端是所有者,另一端必须使用映射注释中的mappedBy
属性。
更新: mappedBy
属性看起来不错。你的OcenaPK
班怎么样?它是否包含idPrzedmiot
列的重复映射?