powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / JPA+postgres не вставлются null в поле date
9 сообщений из 9, страница 1 из 1
JPA+postgres не вставлются null в поле date
    #38632725
gema
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Таблица в БД Postgres 9.1.13
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
    CREATE TABLE container.ac_container
    (
    id serial NOT NULL,
    ser_number character varying(100) NOT NULL, -- серийный номер
    manufacture_id integer NOT NULL, -- производитель
    mass_passp integer, -- масса по паспорту
    mass_fact integer, -- фактическая масса
    volume_passp integer,
    reg_number character varying(50),
    d_fabric date,
    d_from date,
    d_to date,
    d_control date,
    CONSTRAINT container_pkey PRIMARY KEY (id ),
    CONSTRAINT manufacture1 FOREIGN KEY (manufacture_id)
    REFERENCES container.ac_manufacture (id) MATCH SIMPLE
    ON UPDATE CASCADE ON DELETE RESTRICT,
    CONSTRAINT ser_reg_number UNIQUE (ser_number , reg_number )
    )


Класс сущности
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
package entity.spr;
 
import java.io.Serializable;
import java.util.Date;
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.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import javax.xml.bind.annotation.XmlRootElement;
 
/**
*
* @author jane
*/
@Entity
@Table(name = "ac_container")
@XmlRootElement
@NamedQueries({
@NamedQuery(name = "AcContainer.findAll", query = "SELECT a FROM AcContainer a")
})
public class AcContainer 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
@Size(min = 1, max = 100)
@Column(name = "ser_number")
private String serNumber;
@Column(name = "mass_passp")
private Integer massPassp;
@Column(name = "mass_fact")
private Integer massFact;
@Column(name = "volume_passp")
private Integer volumePassp;
@Size(max = 50)
@Column(name = "reg_number")
private String regNumber;
@Column(name = "d_fabric",nullable=true)
@Temporal(TemporalType.DATE)
private Date dFabric;
@Column(name = "d_from",nullable=true)
@Temporal(TemporalType.DATE)
private Date dFrom;
@Column(name = "d_to",nullable=true)
@Temporal(TemporalType.DATE)
private Date dTo;
@Column(name = "d_control",nullable=true)
@Temporal(TemporalType.DATE)
private Date dControl;
@JoinColumn(name = "manufacture_id", referencedColumnName = "id")
@ManyToOne(optional = false)
private AcManufacture manufactureId;
 
public AcContainer() {
}
 
public AcContainer(Integer id) {
this.id = id;
}
 
public AcContainer(Integer id, String serNumber) {
this.id = id;
this.serNumber = serNumber;
}
 
public Integer getId() {
return id;
}
 
public void setId(Integer id) {
this.id = id;
}
 
public String getSerNumber() {
return serNumber;
}
 
public void setSerNumber(String serNumber) {
this.serNumber = serNumber;
}
 
public Integer getMassPassp() {
return massPassp;
}
 
public void setMassPassp(Integer massPassp) {
this.massPassp = massPassp;
}
 
public Integer getMassFact() {
return massFact;
}
 
public void setMassFact(Integer massFact) {
this.massFact = massFact;
}
 
public Integer getVolumePassp() {
return volumePassp;
}
 
public void setVolumePassp(Integer volumePassp) {
this.volumePassp = volumePassp;
}
 
public String getRegNumber() {
return regNumber;
}
 
public void setRegNumber(String regNumber) {
this.regNumber = regNumber;
}
 
public Date getDFabric() {
return dFabric;
}
 
public void setDFabric(Date dFabric) {
this.dFabric = dFabric;
}
 
public Date getDFrom() {
return dFrom;
}
 
public void setDFrom(Date dFrom) {
this.dFrom = dFrom;
}
 
public Date getDTo() {
return dTo;
}
 
public void setDTo(Date dTo) {
this.dTo = dTo;
// this.dTo = null == dTo? null : dTo;
}
 
public Date getDControl() {
return dControl;
}
 
public void setDControl(Date dControl) {
this.dControl = dControl;
}
 
public AcManufacture getManufactureId() {
return manufactureId;
}
 
public void setManufactureId(AcManufacture manufactureId) {
this.manufactureId = manufactureId;
}
 
@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 AcContainer)) {
return false;
}
AcContainer other = (AcContainer) 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 "entity.spr.AcContainer[ id=" + id + " ]";
}
}


Сеансовый компонент
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
    package session.spr;
     
    import entity.spr.AcContainer;
    import entity.spr.AcManufacture;
    import java.util.List;
    import javax.ejb.Stateless;
    import javax.persistence.EntityManager;
    import javax.persistence.PersistenceContext;
     
    /**
    *
    * @author jane
    */
    @Stateless
    public class AcContainerFacade extends AbstractFacade<AcContainer> {
     
    @PersistenceContext(unitName = "containerPU")
    private EntityManager em;
     
    @Override
    protected EntityManager getEntityManager() {
    return em;
    }
     
    public AcContainerFacade() {
    super(AcContainer.class);
    }
     
    public void addContainer(AcContainer c) {
    em.persist(c);
    }
    }


Сервлет, в котором пытаюсь сделать вставку записи
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
    package spr;
     
    import entity.spr.AcContainer;
    import entity.spr.AcManufacture;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.text.DateFormat;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    import javax.ejb.EJB;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import session.spr.AcContainerFacade;
    import session.spr.AcManufactureFacade;
     
    /**
    *
    * @author jane
    */
    @WebServlet(name = "NewServlet", urlPatterns = {"/NewServlet"})
    public class NewServlet extends HttpServlet {
     
    @EJB
    private AcContainerFacade containerFacade;
    @EJB
    private AcManufactureFacade manufactureFacade;
     
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
     
    try (PrintWriter out = response.getWriter()) {
     
    AcContainer c = new AcContainer();
    DateFormat DF = new SimpleDateFormat("yyyy-mm-dd");
    Date myDate = null;
    try {
    myDate = DF.parse("2014-01-01");
    } catch (ParseException ex) {
    Logger.getLogger(NewServlet.class.getName()).log(Level.SEVERE, null, ex);
    }
    c.setDControl(myDate);
    c.setDFabric(myDate);
    c.setDFrom(null);
    c.setDTo(null);
    String serNumber = request.getParameter("ser_number");
    c.setSerNumber(serNumber);
    AcManufacture m = manufactureFacade.findManufacture(3);
    c.setManufactureId(m);
    containerFacade.addContainer(c);
     
    }
     
    }
    }


Выходит ошибка при вставке null в поля типа Date, хотя запрета на это нет. Что не так делаю?
Ошибка:
Call: INSERT INTO ac_container (d_control, d_fabric, d_from, d_to, mass_fact, mass_passp, reg_number, ser_number, volume_passp, manufacture_id) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
bind => [10 parameters bound]
Query: InsertObjectQuery(entity.spr.AcContainer[ id=null ])
at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:340)
at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.processExceptionForCommError(DatabaseAccessor.java:1605)
at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:893)
at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeNoSelect(DatabaseAccessor.java:957)
at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:630)
at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeCall(DatabaseAccessor.java:558)
at org.eclipse.persistence.internal.sessions.AbstractSession.basicExecuteCall(AbstractSession.java:1995)
at org.eclipse.persistence.sessions.server.ClientSession.executeCall(ClientSession.java:296)
at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:242)
at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:228)
at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.insertObject(DatasourceCallQueryMechanism.java:377)
at org.eclipse.persistence.internal.queries.StatementQueryMechanism.insertObject(StatementQueryMechanism.java:165)
at org.eclipse.persistence.internal.queries.StatementQueryMechanism.insertObject(StatementQueryMechanism.java:180)
at org.eclipse.persistence.internal.queries.DatabaseQueryMechanism.insertObjectForWrite(DatabaseQueryMechanism.java:485)
at org.eclipse.persistence.queries.InsertObjectQuery.executeCommit(InsertObjectQuery.java:80)
at org.eclipse.persistence.queries.InsertObjectQuery.executeCommitWithChangeSet(InsertObjectQuery.java:90)
at org.eclipse.persistence.internal.queries.DatabaseQueryMechanism.executeWriteWithChangeSet(DatabaseQueryMechanism.java:300)
at org.eclipse.persistence.queries.WriteObjectQuery.executeDatabaseQuery(WriteObjectQuery.java:58)
at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:899)
at org.eclipse.persistence.queries.DatabaseQuery.executeInUnitOfWork(DatabaseQuery.java:798)
at org.eclipse.persistence.queries.ObjectLevelModifyQuery.executeInUnitOfWorkObjectLevelModifyQuery(ObjectLevelModifyQuery.java:108)
at org.eclipse.persistence.queries.ObjectLevelModifyQuery.executeInUnitOfWork(ObjectLevelModifyQuery.java:85)
at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2894)
at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1797)
at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1779)
at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1730)
at org.eclipse.persistence.internal.sessions.CommitManager.commitNewObjectsForClassWithChangeSet(CommitManager.java:226)
at org.eclipse.persistence.internal.sessions.CommitManager.commitAllObjectsWithChangeSet(CommitManager.java:125)
at org.eclipse.persistence.internal.sessions.AbstractSession.writeAllObjectsWithChangeSet(AbstractSession.java:4200)
at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitToDatabase(UnitOfWorkImpl.java:1439)
at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitToDatabaseWithPreBuiltChangeSet(UnitOfWorkImpl.java:1585)
at org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.writeChanges(RepeatableWriteUnitOfWork.java:452)
at org.eclipse.persistence.internal.jpa.EntityManagerImpl.flush(EntityManagerImpl.java:846)
... 63 more
Caused by: org.postgresql.util.PSQLException: ERROR: column "d_from" is of type date but expression is of type character varying
Подсказка: You will need to rewrite or cast the expression.
Позиция: 155
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2101)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1834)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:255)
at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:510)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:386)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:332)
at com.sun.gjc.spi.base.PreparedStatementWrapper.executeUpdate(PreparedStatementWrapper.java:125)
at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:885)
... 93 more
...
Рейтинг: 0 / 0
JPA+postgres не вставлются null в поле date
    #38632730
gema
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вариант через createNativeQuery работает нормально, но при указании типов полей date и integer.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
 
 public void createContainer(AcContainer c) {
        String query = "INSERT INTO ac_container (d_control, d_fabric, d_from, d_to, mass_fact, mass_passp, reg_number, ser_number, volume_passp, manufacture_id) "
                + " VALUES (to_date(?, 'yyyy-mm-dd'),to_date(?, 'yyyy-mm-ddy'), to_date(?, 'yyyy-mm-dd'), to_date(?, 'yyyy-mm-dd'), ? :: Integer, ?:: Integer, ?:: Integer, ?, ?:: Integer, ?)";

        em.createNativeQuery(query)
                .setParameter(1, c.getDControl())
                .setParameter(2, c.getDFabric())
                .setParameter(3, c.getDFrom())
                .setParameter(4, c.getDTo())
                .setParameter(5, c.getMassFact())
                .setParameter(6, c.getMassPassp())
                .setParameter(7, c.getRegNumber())
                .setParameter(8, c.getSerNumber())
                .setParameter(9, c.getVolumePassp())
                .setParameter(10, c.getManufactureId().getId())
                .executeUpdate();
    }



С mysql таких проблем не было.
...
Рейтинг: 0 / 0
JPA+postgres не вставлются null в поле date
    #38632733
bochkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
непонятно какие данные отправляет eclipselink на сервер
в раздел properties файла persistence.xml включите следующие опции
Код: xml
1.
2.
3.
<property name="eclipselink.logging.level" value="FINE"/>
<property name="eclipselink.logging.parameters" value="true"/>
<property name="eclipselink.jdbc.bind-parameters" value="false"/>


и смотрите что eclipselink передает,
если все правильно значит драйвер смотреть надо
...
Рейтинг: 0 / 0
JPA+postgres не вставлются null в поле date
    #38632752
gema
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
bochkov,я вставила эти строки в persistence.xml и все заработало. Огромное спасибо.
Я так пониманию первые две строки отвечают за протоколирование. Получается секрет успеха в 3 строке
<property name="eclipselink.jdbc.bind-parameters" value="false"/>. Подскажите,что эо за параметр???
...
Рейтинг: 0 / 0
JPA+postgres не вставлются null в поле date
    #38632763
bochkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это плохо что работает только с этим параметром,
он говорит jpa чтоб тот не использовал привязку параметров в запросе,
очень сказывается на производительности,
в обычном режиме sql preparedstatement сперва компилируется с возможностью подмены параметров перед вызовом,
очень выгодно исполнять одинаковые запросы с разными входящими данными,
теперь же каждый вызов sql компилируется заново, очень медленно получается,
надо смотреть какие всетаки параметры уходят в запрос
отключите bind и запустите, надо искать ошибку,
...
Рейтинг: 0 / 0
JPA+postgres не вставлются null в поле date
    #38632773
gema
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
bochkov,
Лог:

CONFIG: Connected: jdbc:postgresql://localhost:5432/container?loginTimeout=0&socketTimeout=0&prepareThreshold=5&unknownLength=2147483647&loglevel=0&tcpkeepalive=false
User: ceh16
Database: PostgreSQL Version: 9.1.13
Driver: PostgreSQL Native Driver Version: PostgreSQL 9.1 JDBC3g (build 903)

Call: INSERT INTO ac_container (d_control, d_fabric, d_from, d_to, mass_fact, mass_passp, reg_number, ser_number, volume_passp, manufacture_id) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
bind => [null, null, null, null, null, null, null, 3333, null, 3]

И та же ошибка
Caused by: org.postgresql.util.PSQLException: ERROR: column "d_control" is of type date but expression is of type character varying
...
Рейтинг: 0 / 0
JPA+postgres не вставлются null в поле date
    #38632863
gema
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Возможно проблема в приведении типов при вставки ведь скажем поле ser_number типа текст, а в параметрах bind, кавычек нет???
...
Рейтинг: 0 / 0
JPA+postgres не вставлются null в поле date
    #38632864
bochkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
похоже что проблема в драйвере,
что то не то передает серверу
поможет посмотреть loglevel=2 в параметрах соединения
может версию драйвера поменять
может еще какие нибудь параметры соединения
...
Рейтинг: 0 / 0
JPA+postgres не вставлются null в поле date
    #38632970
gema
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
установила loglevel=2
в логе
INFO: 14:28:07.526 (1) <=BE ReadyForQuery(I)
FINE: INSERT INTO ac_container (d_control, d_fabric, d_from, d_to, mass_fact, mass_passp, reg_number, ser_number, volume_passp, manufacture_id) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
bind => [null, null, null, null, null, null, null, 3333, null, 3]
INFO: 14:28:07.550 (1) simple execute, handler=org.postgresql.jdbc2.AbstractJdbc2Statement$StatementResultHandler@7a9e872, maxRows=0, fetchSize=0, flags=5
INFO: 14:28:07.551 (1) FE=> Parse(stmt=S_1,query="BEGIN",oids={})
INFO: 14:28:07.552 (1) FE=> Bind(stmt=S_1,portal=null)
INFO: 14:28:07.552 (1) FE=> Execute(portal=null,limit=0)
INFO: 14:28:07.554 (1) FE=> Parse(stmt=null,query="INSERT INTO ac_container (d_control, d_fabric, d_from, d_to, mass_fact, mass_passp, reg_number, ser_number, volume_passp, manufacture_id) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)",oids={1043,1043,1043,1043,23,23,1043,1043,23,23})
INFO: 14:28:07.555 (1) FE=> Bind(stmt=null,portal=null,$1=<NULL>,$2=<NULL>,$3=<NULL>,$4=<NULL>,$5=<NULL>,$6=<NULL>,$7=<NULL>,$8=<'3333'>,$9=<NULL>,$10=<3>)
INFO: 14:28:07.556 (1) FE=> Describe(portal=null)
INFO: 14:28:07.557 (1) FE=> Execute(portal=null,limit=1)
INFO: 14:28:07.558 (1) FE=> Sync
INFO: 14:28:07.559 (1) <=BE ParseComplete [S_1]
INFO: 14:28:07.559 (1) <=BE BindComplete [null]
INFO: 14:28:07.560 (1) <=BE CommandStatus(BEGIN)
INFO: 14:28:07.567 (1) <=BE ErrorMessage(ERROR: column "d_control" is of type date but expression is of type character varying
Подсказка: You will need to rewrite or cast the expression.

Позиция: 147)
INFO: org.postgresql.util.PSQLException: ERROR: column "d_control" is of type date but expression is of type character varying
Подсказка: You will need to rewrite or cast the expression.
Позиция: 147

Посмотрела http://jdbc.postgresql.org/download.html для моей версии postgres 9.1 и jdk 1.7 графа пустая...Попробовала разные версии драйвером, ничего не меняется.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / JPA+postgres не вставлются null в поле date
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]