2015-05-01 3 views
-1

ReportDimensions.java:EntityManager.merge()

package com.test.main.domain.resource; 

import java.io.Serializable; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.Id; 
import javax.persistence.Table; 
import javax.validation.constraints.NotNull; 

@Entity 
@Table(name = "report_dimensions") 
public class ReportDimensions implements Serializable { 

    public ReportDimensions() {   
     super();  
    } 

    public ReportDimensions(long userId, long reportId, String reportType) { 
     super();   
     this.userId = userId;  
     this.reportType = reportType;  
    } 


    public long getDimensionsId() {   
     return dimensionsId;  
    } 

    public void setDimensionsId(long dimensionsId) {   
     this.dimensionsId = dimensionsId; 
    } 

    public long getUserId() {  
     return userId; 
    } 

    public void setUserId(long userId) {   
     this.userId = userId; 
    } 


    public String getReportType() {   
     return reportType; 
    } 

    public void setReportType(String reportType) {  
     this.reportType =reportType;  
    } 

    public int getWinWidth() {  
     return winWidth;  
    } 

    public void setWinWidth(int winWidth) {   
     this.winWidth = winWidth; 
    } 

    public int getWinHeight() { 
     return winHeight; 
    } 

    public void setWinHeight(int winHeight) {  
     this.winHeight = winHeight;  
    } 

    @Id  
    @Column(name = "report_dimensions_id") 
    @GeneratedValue  
    private long dimensionsId;  

    @Column(name = "user_id") 
    @NotNull  
    private long userId; 

    @Column(name = "report_type") 
    @NotNull  
    private String reportType; 

    @Column(name = "window_width") 
    @NotNull  
    private int winWidth; 

    @Column(name = "window_height")  
    @NotNull  
    private int winHeight; 

    private static final long serialVersionUID = 1L;  
} 

Вот мой DAOImpl:

public void updateWindowSize(Long userId, String reportType, int width, int height)  { 
       ReportDimensions dimensions = entityManager.find(ReportDimensions.class, new ReportDimensions(userId, reportType)); 

    if(dimensions == null) dimensions = new ReportDimensions(userId, reportType);  

dimensions.setWinWidth(width); dimensions.setWinHeight(height); 

entityManager.merge(dimensions); } 

Здесь я пытаюсь создать запись, если не существует другого обновить запись. Аргументы конструктора для ReportDimensions не имеют первичного ключа, поскольку он сгенерирован автоматически. Согласно документации для EntityManager.find (arg1, arg2), мы должны использовать первичный ключ для 2-го аргумента. Я не получал автоматически сгенерированный идентификатор в любой момент времени. Что я должен сделать для всего этого, чтобы работать.

+0

добавить больше деталей, показать полный код для 'ReportDimensions' лица – Chaitanya

ответ

0

Убедитесь, что значение для столбца «report_type» не должно быть нулевым во время построения объекта в Java.

+0

Спасибо за ответ Arpit. Я использую Eclipse, и я проверил объект. Он имел значение «inProgress» для типа reportType. –

+0

Что у него после слияния? – Arpit

+0

Опубликовано полный метод ... –

0

Я нашел работу вокруг ....

общественного недействительными updateWindowSize (Long идентификатор пользователя, String Тип уведомления, ширина INT, INT высота) {

ReportDimensions размеры = NULL;

Query query = entityManager.createQuery("SELECT dim FROM " + ReportDimensions.class.getName() + " dim WHERE dim.userId=:userId AND dim.reportType=:reportType"); 

try { 
    dimensions = (ReportDimensions)query.setParameter("userId", new Long(userId)).setParameter("reportType", reportType).getSingleResult(); 
} catch (NoResultException ex) { 
    dimensions = new ReportDimensions(userId, reportType); 
} 
dimensions.setWinWidth(width); 
dimensions.setWinHeight(height); 

entityManager.merge(dimensions); 

}