我有一个简单的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;
}