java - 休眠序列生成器,ConstraintViolationException
问题描述
我有一个简单的 SaveMenuElement ,如下所示,在最后一行的合并方法上,我得到约束违反异常,每 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;
}
解决方案
推荐阅读
- java - 如何修复 NullPointerException 尝试在 Jersey 2.x 中实例化 CloseableHttpClient
- html - 我如何在底部有页脚的所有屏幕上制作所有相同高度的卡片?
- machine-learning - 是否可以为 scikit-learn LDA 设置初始主题分配?
- javascript - 从对象数组中按键创建对象数组
- python - How do I remove certain items from the dictionary?
- python - 创建用于转换多个熊猫列上的数据类型的可重用函数
- swift - 如何在触摸屏幕时移动精灵并在我点击屏幕时禁用
- angular - Angular 导入 * 到模块声明中
- r - 如何迭代计算 t 检验的 p 值
- python - Python renom 模块具有相同的函数/成员名称,但标记为不同的颜色