【问题标题】:How to properly use JPA/Hibernate?问题 JPA/休眠
【发布时间】: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


【解决方案1】:

这没有多大意义。仅当表中有鉴别器在实体模型中没有匹配时才会引发此异常。也许您的表格中有尾随空格?

【讨论】:

  • 感谢您的留言。我认为问题出在抽象类上,因为如果我将 Articles 类更改为具体类,一切似乎都可以正常工作。但我不知道如何解决这个问题。我的桌子上没有空间了。
  • 我可能是错的,但例外是Discriminator: Ramette 。看到尾随空格了吗?尝试通过 select * from Articles where trim(type) &lt;&gt; type 检查尾随空格
  • 这个查询没有返回错误。我的桌子上没有空间了。
  • 查询不会返回错误,而是返回带有尾随空格的行列表。
  • 当我执行请求时,没有显示任何行
猜你喜欢
  • 1970-01-01
  • 2014-08-08
  • 1970-01-01
  • 1970-01-01
  • 2014-08-14
  • 2012-09-17
相关资源
最近更新 更多