当前位置: 首页 > 知识库问答 >
问题:

如何正确使用JPA/Hibernate?

袁宜
2023-03-14

我试图更好地理解JPA/Hibernate和SQL服务器的注释。

我创建了一个简单的项目:一个名为“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');

共有1个答案

王楚青
2023-03-14

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

 类似资料:
  • 问题内容: 我当时正在收集有关flush()方法的信息,但是我不清楚何时使用它以及如何正确使用它。从我的阅读中,我的理解是持久性上下文的内容将与数据库同步,即发布未完成的语句或刷新实体数据。 现在,我得到了具有两个实体的场景,并且(一对一关系,但未由JPA强制执行或建模)。具有手动设置的复合PK,还具有自动生成的IDENTITY字段。这应该作为的外键写入到实体。我要存钱,并且要进行一次交易。问题是

  • 问题内容: 我只想检索UserAccount类中的某些列,所以我有以下代码: 我得到了空值作为回报。但是,如果我注释掉setProjections,我将获得具有所有属性的用户。在这种情况下,如何正确使用setProjection? 问题答案: 它返回一个Object数组,因此代码应为:

  • 问题内容: 我不知道我在哪里错了:/。当我运行这段代码时,我得到的只是一个空白元素。我似乎无法让insertRule方法执行任何操作(甚至不会产生错误)。我想念什么吗? 问题答案: 这有点令人困惑,但是您的代码确实可以工作,只是您看不到返回的XML树中插入的规则。 为了验证您的代码是否有效,您可以执行两个测试: 运行上面的代码片段,您可以看到CSS规则确实适用。并且属性也在控制台中更改。 当浏览器

  • 问题内容: 如何使用从类路径中查找递归资源? 例如 在“目录”中查找所有资源:想象一下 不幸的是,这只会检索到恰好该“目录”。 所有资源都已命名(递归) 但这返回一个空。 还有一个额外的问题:与有什么不同? 问题答案: 没有办法递归搜索类路径。您需要知道资源的完整路径名才能以这种方式检索它。该资源可能位于文件系统中的目录中,也可能位于jar文件中,因此它不像执行“类路径”的目录列表那样简单。您将需

  • 问题内容: 我最近开始使用ScriptManager。我有一个通过JavaScript填充的ASP.NET DropDownList控件。但是,我正在使用事件验证。因此,如果我不使用下拉菜单中的“ RegisterForEventValidation”调用,则会遇到以下错误。我怎么知道在第二个参数中设置什么值(我有“值”)?我正在通过JavaScript填充下拉列表,因此我不知道后面的代码中包含哪

  • 我正在尝试正确地使用ByteBuffer和BigEndian字节顺序格式。。 我有几个字段,我试图把它存储在Cassandra数据库之前放在一个单一的ByteBuffer中。 我将要写入Cassandra的字节数组由三个字节数组组成,如下所述- 现在,我将写,和一起到一个字节数组和由此产生的字节数组我将写入Cassandra,然后我将有我的C程序来检索它字节数组数据从Cassandra,然后反序列