JPA продолжает громить: «Объект: entity.Json [id = null] не является известным типом Entity».

0

ОБНОВЛЕНИЕ Кажется, что если добавить временную метку, это вызовет проблемы, но я понятия не имею, почему. Я пробовал некоторые советы, но, к сожалению, он не работал

@Basic(optional = true)
@NotNull
@Column(name="created", columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP")
@Temporal(TemporalType.TIMESTAMP)
private Date created;

ОБНОВЛЕНИЕ # 2

Это худший результат: проблема исправлена, но я не знаю почему! Я изменил класс сущности на:

@Basic(optional = false)
@Column(name="created", insertable = false, updatable = false)
@Temporal(TemporalType.TIMESTAMP)
private Date created;

и это все еще не сработало. Я перезапустил старую рыбку, она все еще не сработала. Я пошел на собрание, снова перезапустил его и ЭТО РАБОТАЛ. Я очень раздражен, поскольку ничего не узнаю и потерял часы на то, что должно было занять 30 секунд.

Я редактировал проект в Netbeans в режиме отладки, поэтому я ожидал, что все мои изменения будут перераспределены при сохранении файла. Если это не так, возможно, вы можете пролить свет.

Я также попытался настроить org.hibernate.ejb.HibernatePersistence, но я просто сдался... пока :)

-------------------------------------------------- ------------------

TL; DR

Я боролся с этим часами и читал все сообщения, которые я мог найти в SOF.

Я в конечном итоге уничтожил таблицу в своих усилиях, чтобы заставить ее работать, и хотя я определил автоинкрементный первичный идентификатор, я получаю

Объект: entity.Json [id = null] не является известным типом Entity.

ошибка, и если я установил значение, я получаю

Ограничения проверки достоверности бинов при выполнении автоматической проверки бина в событии обратного вызова: "prePersist". Пожалуйста, обратитесь к встроенным ConstraintViolations за подробностями.

ошибка.

Таблица MySQL

CREATE TABLE 'evaluationdb'.'json' ( 'id' INT NOT NULL AUTO_INCREMENT , 
'ref_id' INT NOT NULL , 
'json' VARCHAR(4096) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL , 
'created' TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ,
PRIMARY KEY ('id')) 
ENGINE = InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci;

Entitiy

package entities;

import java.io.Serializable;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import javax.xml.bind.annotation.XmlRootElement;

@Entity
@Table(name = "json")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Json.findAll", query = "SELECT j FROM Json j")
    , @NamedQuery(name = "Json.findById", query = "SELECT j FROM Json j WHERE j.id = :id")
    , @NamedQuery(name = "Json.findByRefid", query = "SELECT j FROM Json j WHERE j.refid = :refid")
    , @NamedQuery(name = "Json.findByJson", query = "SELECT j FROM Json j WHERE j.json = :json")})
public class Json implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id")
    private Integer id;
    @Basic(optional = false)
    @NotNull
    @Column(name = "refid")
    private int refid;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 4096)
    @Column(name = "json")
    private String json;

    public Json() {
    }

    public Json(Integer id) {
        this.id = id;
    }

    public Json(Integer id, int refid, String json) {
        this.id = id;
        this.refid = refid;
        this.json = json;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public int getRefid() {
        return refid;
    }

    public void setRefid(int refid) {
        this.refid = refid;
    }

    public String getJson() {
        return json;
    }

    public void setJson(String json) {
        this.json = json;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Json)) {
            return false;
        }
        Json other = (Json) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "entities.Json[ id=" + id + " ]";
    }

}

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="com.mycompany_responseableES_war_1.0-SNAPSHOTPU" transaction-type="RESOURCE_LOCAL">
        <!--<jta-data-source>java:app/responseablees_working</jta-data-source>-->
        <class>entities.Openanswer</class>
        <class>com.company.responseablees.entities.ResponseHasOpenanswer</class>
        <class>entities.Json</class>
        <exclude-unlisted-classes>false</exclude-unlisted-classes>
        <properties>
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/evaluationdb"/>
            <property name="javax.persistence.jdbc.user" value="responseablees"/>
            <property name="javax.persistence.jdbc.password" value="responseablees"/>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
            <!--         <property name="eclipselink.logging.level" value="FINE"/>
            <property name="eclipselink.ddl-generation" value="create-tables"/>-->
        </properties>
    </persistence-unit>
</persistence>

Код

EntityManagerFactory emfactory = Persistence.createEntityManagerFactory("com.mycompany_responseableES_war_1.0-SNAPSHOTPU");
EntityManager em = emfactory.createEntityManager( );
em.getTransaction().begin();
Json json = new Json();

json.setId(1);
json.setRefid(1);
json.setJson("test");

em.persist(json);
em.getTransaction().commit();

Кто-нибудь видит проблему с кодом, который я перечислил?

Теги:
jpa-2.0

1 ответ

0

Есть вероятность того, что поле "id" будет NULL, поскольку это целое число. Если вы используете int вместо Integer, ваша проблема будет решена. Вы должны использовать Integer только тогда, когда ваш столбец имеет значение NULL. Стандартная практика заключается в том, чтобы идти с примитивами, если вы не имеете дело с дженериками

Читайте об автобоксинге и распаковке в java для лучшего понимания.

  • 0
    Он использует Integer (как я могу добавить в документах Hibernate ...), потому что он хочет оставить свойство пустым и позволить стратегии автогенерации выполнить свою работу. Это не совсем ответ на его проблему
  • 0
    Спасибо, ребята, выясняется, что поле id автоматически увеличивается, и это временная метка, которая вызывает проблему. Честно говоря, я построил десятки систем на PHP-фреймворках, эта проблема для меня не имеет смысла.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню