休眠序列生成器,ConstraintViolationException

时间:2020-07-16 15:14:52

标签: java hibernate

我有一个简单的SaveMenuElement,如下所示,在最后一行的merge方法上,我遇到约束违例异常,每5次尝试都会出现一次此错误,因此它不是恒定的,但是会发生。

public void saveMenuElement(ElementMenuDTO em, Long parentId, EAppType appType, List<BaseAddField> baseAddFields) {
        if (em.getId() != null) {  
            LSP_MenuConfigOB mc = getEntityManager().find(LSP_MenuConfigOB.class, em.getId());
            mc.setIdx(em.getIdx());
            mc.getLspMessage().setMessage(em.getNazwa());
            mc.setMenuAction(em.getAkcja());
            mc.setPrivilege(em.getPrivilege());
            mc.setStyle(em.getStyle());
            if (baseAddFields != null) {
                for (BaseAddField field : baseAddFields) {
                    mergeMessage(mc.getLspMessage().getMsgKey(), field.getParam5(), (String) field.getValue());
                }
            }
            getEntityManager().merge(mc);
        } else { 
            LSP_MenuConfigOB mc = new LSP_MenuConfigOB();
            mc.setApplicationId(lspUtilService.getDfeApplicationOBFromEAppType(appType).getId());
            mc.setId(null);
            mc.setIdx(em.getIdx());
            mc.setIsRoot(false);
            mc.setLspMessage(createNewLSPMessage(em.getNazwa()));
            mc.setMenuAction(em.getAkcja());
            mc.setParentId(parentId);
            mc.setPrivilege(em.getPrivilege());
            mc.setStyle(em.getStyle());
            if (baseAddFields != null) {
                for (BaseAddField field : baseAddFields) {
                    mergeMessage(mc.getLspMessage().getMsgKey(), field.getParam5(), (String) field.getValue());
                }
            }
            getEntityManager().persist(mc);
            getEntityManager().flush();

            LSP_MessagesOB message = mc.getLspMessage();
            message.setMsgKey("menu." + appType.value() + "." + mc.getId().toString());

            getEntityManager().merge(mc); // THIS LINE PRODUCES THE ERROR.
        }
    }

涉及的实体如下

@Entity
@Table(name = "LSP_MENUCONFIG")
@NamedQueries({ @NamedQuery(name = "LSP_MenuConfigOB.findAll", query = "SELECT m FROM LSP_MenuConfigOB m where m.isRoot = true"),
        @NamedQuery(name = "LSP_MenuConfigOB.findRootByApp", query = "SELECT m FROM LSP_MenuConfigOB m where m.applicationId = :appId and m.isRoot = true") })
@SequenceGenerator(allocationSize = 1, name = "SEKWENCJA", sequenceName = "GEN_LSP_MENUCONFIG_ID")
public class LSP_MenuConfigOB extends BaseOB {

    private Long                   idx;
    private Long                   lspMessageId;
    private LSP_MessagesOB         lspMessage;
    private String                 menuAction;
    private String                 style;
    private String                 privilege;
    private boolean                isRoot;
    private Long                   applicationId;

    private Long                   parentId;
    private List<LSP_MenuConfigOB> listChildren;

AND 

@Entity
@Table(name = "LSP_MESSAGES")
@NamedQueries({ @NamedQuery(name = "LSP_MessagesOB.findAll", query = "SELECT m FROM LSP_MessagesOB m"),
        @NamedQuery(name = "LSP_MessagesOB.findByMsgKey", query = "SELECT m FROM LSP_MessagesOB m WHERE m.msgKey = :msgKey"),
        @NamedQuery(name = "LSP_MessagesOB.findDefault", query = "SELECT m FROM LSP_MessagesOB m WHERE m.locale is null"),
        @NamedQuery(name = "LSP_MessagesOB.findByLocale", query = "SELECT m FROM LSP_MessagesOB m WHERE LOWER(m.locale) = LOWER(:locale)") })
@SequenceGenerator(allocationSize = 1, name = "SEKWENCJA", sequenceName = "GEN_LSP_MESSAGES_ID")
public class LSP_MessagesOB extends BaseOB {

    public static final String SEPARATOR = "_";

    private String             locale;
    private String             message;
    private String             msgKey;
    private String             index;

    @Column(name = "MSGKEY")
    public String getMsgKey() {
        return msgKey;
    }

BaseOb看起来像这样

@MappedSuperclass
@SequenceGenerator(allocationSize = 1, name = "SEKWENCJA", sequenceName = "SEQ")
public abstract class BaseOB implements Serializable {

    final static String nullDate = "1899-12-30 00:00:00.000";
    private static Log  log      = LogFactory.getLog(BaseOB.class);
    protected Long      id;

    @Id
    @Column(name = "ID")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEKWENCJA")
    public Long getId() {
        return id;
    }

0 个答案:

没有答案