JPA слияние не может обновить значения в таблице - PullRequest
0 голосов
/ 15 февраля 2019

Я пытаюсь использовать JPA для простого обновления столбца моей таблицы в MYSQL.

Вот фрагмент:

public Node get_folder(long fileID) {
    try {
        List resList = nodeFacade.list_parent(fileID, LinkType.FILE);
        List resList1 = nodeFacade.list_parent(fileID, LinkType.VER_LINKS);
        if (resList == null) {
            throw new Exception("failed to get folder of a file." + 
                nodeFacade.getMsg());
        }
        if (resList.size() > 1) {
            throw new Exception("one file cannot be attached to more than one folder(s).");
        }

        //fixed bugs: modified here to display different version
        if(resList1.size()==1){
            Fmedia fmedia = em.find(fileID,Fmedia.class);
            fmedia.setFstatus(2);
            em.merge(fmedia);
            return (Node) resList1.get(0);
        }

Теперь fmedia - это таблица, и я хочуобновить существующую запись значения в столбце fstatus таблицы.Я получил ошибку:

Причина: com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException: столбец 'FEXT' не может быть пустым

FEXT является столбцомв той же таблице, и это не обнуляемый столбец, но к этой записи уже привязано значение. Исключение выдается в строке em.merge(fmedia).Я не понимаю, в чем здесь проблема.

Я не мог использовать save, поскольку мой JPA - более старая версия.

Кто-нибудь знает, что я делаю неправильно?

РЕДАКТИРОВАТЬ: код организации:

@Entity
@Table(name = "fmedia")
public class Fmedia implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @NotNull
    @Column(name = "NODEID")
    private Long nodeid;
    @Basic(optional = false)
    @Column(name = "FONAME")
    private String foname;
    @Basic(optional = false)
    @Column(name = "FGNAME")
    private String fgname;
    @Basic(optional = false)
    @Column(name = "FEXT")
    private String fext;
    @Basic(optional = false)
    @Column(name = "FFULPATH")
    private String ffulpath;
    @Column(name = "FTYPE")
    private int ftype;
    @Basic(optional = false)
    @Column(name = "FSIZE")
    private long fsize;
    @Column(name = "FREMARK")
    private String fremark;
    @Column(name = "FSTATUS")
    private int fstatus;
    @Column(name = "FDESC")
    private String fdesc;
    @Column(name = "MODIFYDATE")
    @Temporal(TemporalType.DATE)
    private Date ModifyDate;
    @Size(max = 3000)
    @Column(name = "FNTFREMARK")
    private String fntfremark;
    @Transient
    private Fverinfo fver;

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Слияние используется для отделения сущностей.Если вы хотите обновить существующую сущность, используйте fetch + update .

1) извлеките существующую сущность по nodeid

2) обновите необходимые поля в этой сущности (например, fmedia)..setFstatus (2))

3) сохранить объект (если вы используете Hibernate, сохранение не требуется, Hibernate по-прежнему будет выдавать оператор Update)

Fmedia fmedia = repository.findOne(nodeid); //manged entity-update
fmedia.setFstatus(2); // hibernate will issue an update, cause the entity is managed
repository.save(fmedia) //redundant save anti-pattern, don't call save

Использование entityManager:

entityManager.find(Fmedia.class, nodeId);

Если вы хотите получить вашу сущность на основе чего-то другого, а не primaryId, вам придется создать запрос:

entityManager.createQuery("select m from Fmedia m where m.foname = :foname");
0 голосов
/ 15 февраля 2019

Слияние не требует извлечения существующей сущности и обновления этой сущности вместо сохранения новой с тем же идентификатором, например:

Fmedia fmedia = em.find(FMEdia.class, fileId);
fmedia.setFstatus(2);
em.persist(fmedia);

Слияние для присоединения существующей, но отсоединенной сущности кконтекст постоянства и ваш new FMedia(..) не отделен, а просто новый.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...