【发布时间】:2021-02-25 15:39:38
【问题描述】:
我正在尝试使用 JPA/Hibernate 和 SQL Server 更好地理解注释。
我创建了一个简单的项目:一个名为“Articles”的抽象类。有两个类继承它:添加权重的 Ramette 和添加颜色的 Pen。下面的代码不起作用,我无法更正错误。你有想法吗?谢谢!
package fr.eni.hibernate.entities;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.DiscriminatorColumn;
import javax.persistence.DiscriminatorType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.Table;
@Entity
@Table(name = "Articles")
@Inheritance( strategy = InheritanceType.SINGLE_TABLE )
@DiscriminatorColumn( name="type", discriminatorType = DiscriminatorType.STRING)
public abstract class Articles implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "idarticle")
private Integer idarticle;
@Column(name = "reference")
private String reference;
@Column(name = "marque")
private String marque ;
@Column(name = "designation")
private String designation;
@Column(name = "prixUnitaire")
private float prixUnitaire ;
@Column(name = "qteStock")
private int qteStock ;
public Articles() {
}
public Integer getIdArticle() {
return idarticle;
}
public String getReference() {
return reference;
}
public void setReference(String reference) {
this.reference = reference;
}
public String getMarque() {
return marque;
}
public void setMarque(String marque) {
this.marque = marque;
}
public String getDesignation() {
return designation;
}
public void setDesignation(String designation) {
this.designation = designation;
}
public float getPrixUnitaire() {
return prixUnitaire;
}
public void setPrixUnitaire(float prixUnitaire) {
this.prixUnitaire = prixUnitaire;
}
public int getQteStock() {
return qteStock;
}
public void setQteStock(int qteStock) {
this.qteStock = qteStock;
}
@Override
public String toString() {
return "Article [idArticle=" + idarticle + ", reference=" + reference + ", marque=" + marque + ", designation="
+ designation + ", prixUnitaire=" + prixUnitaire + ", qteStock=" + qteStock + "]";
}
}
package fr.eni.hibernate.entities;
import javax.persistence.Column;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
@Entity
@DiscriminatorValue("Ramette")
public class Ramette extends Articles {
private static final long serialVersionUID = 1L;
private int grammage;
public Ramette() {
}
@Column(name = "grammage")
public int getGrammage() {
return grammage;
}
public void setGrammage(int grammage) {
this.grammage = grammage;
}
@Override
public String toString() {
return super.toString() + " Ramette [grammage=" + grammage + "]";
}
}
package fr.eni.hibernate.entities;
import javax.persistence.Column;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
@Entity
@DiscriminatorValue("Stylo")
public class Stylo extends Articles {
private static final long serialVersionUID = 1L;
private String couleur;
public Stylo() {
}
@Column(name = "couleur")
public String getCouleur() {
return couleur;
}
public void setCouleur(String couleur) {
this.couleur = couleur;
}
@Override
public String toString() {
return super.toString() + " Stylo [couleur=" + couleur + "]";
}
}
package fr.eni.hibernate.entities;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.TypedQuery;
public class Main {
public static void main(String[] args) throws Exception {
EntityManagerFactory entityManagerFactory = null;
EntityManager entityManager = null;
try {
entityManagerFactory = Persistence.createEntityManagerFactory("WebStore");
entityManager = entityManagerFactory.createEntityManager();
TypedQuery<Articles> query = entityManager.createQuery("from Articles", Articles.class);
List<Articles> art = query.getResultList();
for (Articles article : art) {
System.out.println(art.getClass().getName());
System.out.println("\t" + article);
}
} finally {
if (entityManager != null)
entityManager.close();
if (entityManagerFactory != null)
entityManagerFactory.close();
}
}
}
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns<img src="images/smilies/icon_mad.gif" border="0" alt="" title=":x" class="inlineimg" />si="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="WebStore">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<class>fr.eni.hibernate.entities.Articles</class>
<class>fr.eni.hibernate.entities.Stylo</class>
<class>fr.eni.hibernate.entities.Ramette</class>
<properties>
<property name="javax.persistence.jdbc.driver"
value="com.microsoft.sqlserver.jdbc.SQLServerDriver" />
<property name="javax.persistence.jdbc.url"
value="jdbc:sqlserver://localhost;database=PAPETERIE_TEST" />
<property name="javax.persistence.jdbc.user" value="xx" />
<property name="javax.persistence.jdbc.password" value="x" />
<property name="hibernate.dialect"
value="org.hibernate.dialect.SQLServerDialect" />
<property name="hibernate.format_sql" value="false" />
</properties>
</persistence-unit>
</persistence>
CREATE TABLE Articles
(
idarticle INT IDENTITY(1,1),
reference varchar(10) NOT NULL,
marque nvarchar(200) NOT NULL,
designation nvarchar(250) NOT NULL,
prixUnitaire float NOT NULL,
qteStock int NOT NULL,
grammage int NULL,
couleur nvarchar(50) NULL,
type nchar(10) NOT NULL,
CONSTRAINT PK_Articles PRIMARY KEY (idarticle)
)
INSERT INTO Articles (reference, marque, designation, prixUnitaire, qteStock, grammage, couleur, type)
VALUES ('Bic', 'BBOrange', 'Bic bille Orange', 1.2, 20, 0, 'Bleu', 'Stylo'),
('Bic', 'BBOrange', 'Bic bille Orange', 1.2, 20, 0,'noir', 'Stylo'),
('Clairef', 'CRA4S', 'Ramette A4 Sup', 9, 20, 80, null, 'Ramette');
线程“主”javax.persistence.PersistenceException 中的异常:org.hibernate.WrongClassException:对象 [id=5] 不属于指定的子类 [fr.eni.hibernate.entities.Articles]:鉴别器:Ramette
在 org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:154) 在 org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1542) 在 org.hibernate.query.Query.getResultList(Query.java:165) 在 fr.eni.hibernate.entities.Main.main(Main.java:22) 原因:org.hibernate.WrongClassException:对象 [id=5] 不属于指定的子类 [fr.eni.hibernate.entities.Articles]:鉴别器:Ramette
在 org.hibernate.loader.Loader.getInstanceClass(Loader.java:1945) 在 org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1726) 在 org.hibernate.loader.Loader.getRow(Loader.java:1623) 在 org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:740) 在 org.hibernate.loader.Loader.getRowsFromResultSet(Loader.java:1039) 在 org.hibernate.loader.Loader.processResultSet(Loader.java:990) 在 org.hibernate.loader.Loader.doQuery(Loader.java:959) 在 org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:349) 在 org.hibernate.loader.Loader.doList(Loader.java:2850) 在 org.hibernate.loader.Loader.doList(Loader.java:2832) 在 org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2664) 在 org.hibernate.loader.Loader.list(Loader.java:2659) 在 org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:506) 在 org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:400) 在 org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:219) 在 org.hibernate.internal.SessionImpl.list(SessionImpl.java:1414) 在 org.hibernate.query.internal.AbstractProducedQuery.doList(AbstractProducedQuery.java:1565) 在 org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1533) ... 2 更多
【问题讨论】:
-
对于帮助您的人,您确实需要发布您收到的异常堆栈跟踪或错误消息。
-
搞定了,谢谢
-
@nathaliej 您能否也显示
Ramette实体? -
@SternK 没关系
标签: java sql-server spring hibernate