如果我有一个主实体:
@Entity
public class Test implements Serializable {
@Id
@Column(name="TEST_ID" nullable = false)
private BigDecimal testId;
@Column(unique = true, length = 30)
private String code;
@Temporal(TemporalType.TIMESTAMP)
@Column(nullable = false, length = 50)
private String name;
@Column(name="SYS_VERSION_NUMBER",nullable = false, length = 50)
private Long sysVersionNumber;
@OneToMany(mappedBy = "test", orphanRemoval=true, cascade = { CascadeType.PERSIST, CascadeType.MERGE })
private List<TestDetail> testDetailList;
public Test() {}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public BigDecimal getTestId() {
return testId;
}
public void setTestId(BigDecimal testId) {
this.testId = testId;
}
public Long getSysVersionNumber() {
return sysVersionNumber;
}
public void setSysVersionNumber(Long sysVersionNumber) {
this.sysVersionNumber = sysVersionNumber;
}
public List<TestDetail> getTestDetailList() {
return testDetailList;
}
public void setTestDetailList(List<TestDetail> testDetailList) {
this.testDetailList = testDetailList;
}
public TestDetail addTestDetailList(TestDetail testDetail) {
getTestDetailList().add(testDetail testDetail);
testDetail.setTest(this);
testDetail.setTestId(this.getTestId());
return testDetail;
}
public TestDetail removeProvbilling(TestDetail testDetail) {
getTestDetailList().remove(testDetail testDetail);
testDetail.setTest(null);
testDetail.setTestId(null);
return testDetail;
}
@Override
public boolean equals(Object object) {
if (this == object) {
return true;
}
if (!(object instanceof Test)) {
return false;
}
final Test other = (Test) object;
if (!(id == null ? other.testId == null : testId.equals(other.testId))) {
return false;
}
return true;
}
@Override
public int hashCode() {
final int PRIME = 37;
int result = 1;
result = PRIME * result + ((test == null) ? 0 : test.hashCode());
return result;
}
}
我有一个细节实体
@Entity
public class Testdetail implements Serializable {
@Id
@Column(name = "TESTDETAIL_ID", nullable = false)
private BigDecimal testdetailId;
@Version
@Column(name = "SYS_VERSION_NUMBER")
private Long sysVersionNumber;
@ManyToOne
@JoinColumn(name = "TEST_ID", insertable=false, updatable=false)
private TEST test;
@Column(name = "TEST_ID",)
private BigDecimal testId;
@Column
private String name;
public Testdetail() {
}
public Test getTest() {
return test;
}
public void setTest(Test test) {
this.test = test;
}
public void setTestId(BigDecimal testId) {
this.testId = testId;
}
public BigDecimal getTestId() {
return testId;
}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public Long getSysVersionNumber() {
return sysVersionNumber;
}
public void setSysVersionNumber(Long sysVersionNumber) {
this.sysVersionNumber = sysVersionNumber;
}
}
如果我在两个具有相同测试记录的选项卡中运行页面,并在第一个选项卡中为“testdetail”添加新记录,然后在第二个选项卡中为“testdetail”添加记录(我在sessionbean中调用方法mergetest(),它在保存时调用em.merge(test)),第一个选项卡中添加的记录将消失,即使sysversionnumber工作正常,以防止用户编辑在第二个选项卡中编辑的现有记录。
如果主记录是通过sessionbean中的entitymanager使用的,是否有方法阻止用户在第二个选项卡中添加记录或锁定主记录?
1条答案
按热度按时间jaql4c8m1#
打电话后我找到了解决办法
em.merge(test);
我得用锁把它锁上em.lock(test, LockModeType.OPTIMISTIC_FORCE_INCREMENT);