简体   繁体   English

分两期在主从ADF中详细添加记录

[英]Add record in detail in master-detail ADF in two sessions

if I have a master entity :如果我有一个主实体:

@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;
    }    
}

and I have a detail entity我有一个细节实体



@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;
    }

}

if I run the page in twice two tabs with the same Test record and add new record for 'testDetail' in the first tab then add record for 'testDetail' in second tab (I am calling method mergeTest() in sessionbean which invoke em.merge(test) on saving), the added record in fist tab is gone even though sysversionnumber is working properly to prevent user from editing existing records if they were edited in the second tab.如果我在具有相同测试记录的两个选项卡中两次运行页面,并在第一个选项卡中为“testDetail”添加新记录,然后在第二个选项卡中为“testDetail”添加记录(我在调用em 的sessionbean 中调用方法mergeTest() 。合并(测试)保存),即使 sysversionnumber 正常工作以防止用户编辑在第二个选项卡中编辑的现有记录,在第一个选项卡中添加的记录也消失了。

is there a way to prevent user from adding record in second tab or to lock master record if it is used through EntityManager in sessionBean?有没有办法阻止用户在第二个选项卡中添加记录或锁定主记录(如果它是通过 sessionBean 中的 EntityManager 使用的)?

I found a solution after calling em.merge(test);我在调用em.merge(test);后找到了解决方案em.merge(test); I have to lock it using em.lock(test, LockModeType.OPTIMISTIC_FORCE_INCREMENT);我必须使用em.lock(test, LockModeType.OPTIMISTIC_FORCE_INCREMENT);锁定它em.lock(test, LockModeType.OPTIMISTIC_FORCE_INCREMENT);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM