在两个会话中在master detail adf中添加详细记录

72qzrwbm  于 2021-07-11  发布在  Java
关注(0)|答案(1)|浏览(315)

如果我有一个主实体:

@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使用的,是否有方法阻止用户在第二个选项卡中添加记录或锁定主记录?

jaql4c8m

jaql4c8m1#

打电话后我找到了解决办法 em.merge(test); 我得用锁把它锁上 em.lock(test, LockModeType.OPTIMISTIC_FORCE_INCREMENT);

相关问题