2016-12-04 30 views
0

我正在開發一個小型的JAVA項目來改進我的密碼工作。爲此,我使用H2數據庫將數據和Spring數據JPA存儲爲OR映射器。所有的DML操作都可以正常工作,但我不想讓用戶從數據庫中刪除密碼。爲此,我在名爲DML_ART的Bean中添加一個字段。 DML_ART是一個字符串字段,它是行的狀態。例如,如果用戶在刪除時單擊JSF GUI,則該標誌將設置爲「DELETE」。Spring Data JPA過濾器有自己查詢的子類中的數據

在此行忽略的數據負載上。 SQL查詢適用於DBPasswordEntity,但子類也按照相同的條件過濾。

但是書面聲明並不重要。我不知道爲什麼。

DBPasswordEntity.java

@Entity 
@Table(name = "PasswordEntity",schema = "pwdmanager") 
@PrimaryKeyJoinColumn(name = "password_id", referencedColumnName = "id") 
@Getter 
@Setter 
public class DBPasswordEntity extends DBMetaDataEntity implements Serializable { 

    @Basic 
    @Column(name = "PASSWORD", nullable = false, length = 4000) 
    private String password; 

    @OneToMany(fetch = FetchType.EAGER,cascade = ALL, mappedBy = "password") 
    private Set<DBExtendEntity> extend; 

    @Transient 
    public void addExtend(DBExtendEntity ex) 
    { 
     if(extend == null) 
     { 
      extend = new LinkedHashSet<>(); 
     } 
     extend.add(ex); 
    } 

    } 

DBExtendEntity.java

@Entity 
@Table(name = "ExtendEntity",schema = "pwdmanager") 
@PrimaryKeyJoinColumn(name = "extend_id", referencedColumnName = "id") 
@Getter 
@Setter 
public class DBExtendEntity extends DBMetaDataEntity implements Serializable{ 

    @Basic 
    @Column(name = "NAME", nullable = false, length = 255) 
    private String name; 

    @ManyToOne(optional = false) 
    @JoinColumn(name = "password", referencedColumnName = "Password_ID") 
    private DBPasswordEntity password; 
} 

DBMetaDataEntity

@Entity 
@Inheritance(strategy = InheritanceType.JOINED) 
@DiscriminatorColumn(name = "pwd_type") 
@Table(name = "MetaDataEntity",schema = "pwdmanager") 
@Data 
public abstract class DBMetaDataEntity { 

    @Id 
    @Column(name = "ID", nullable = false) 
    @GeneratedValue(strategy= GenerationType.IDENTITY) 
    private Integer id; 

    @Basic 
    @Column(name = "DML_ART", nullable = false) 
    private String dml_art ="INSERT"; 
} 

SQL-過濾 - 操作

@Transactional 
public interface PasswordRepository extends JpaRepository<DBPasswordEntity,String> { 

    @Query(value="SELECT pwd FROM DBPasswordEntity pwd WHERE pwd.dml_art <> 'DELETE' AND pwd.extend.id IN (SELECT ext.id FROM DBExtendEntity ext where ext.dml_art <> 'DELETE')") 
    List<DBPasswordEntity> findAll_DML_ART(); 
} 

回答

0

我切換到休眠解決它。在子類中

我updatet POM

<dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-core</artifactId> 
      <version>${hibernate.version}</version> 
      <exclusions> 
       <exclusion> 
        <artifactId>jboss-logging</artifactId> 
        <groupId>org.jboss.logging</groupId> 
       </exclusion> 
      </exclusions> 
     </dependency> 
     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-validator</artifactId> 
      <version>${hibernate-validator.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>javax.transaction</groupId> 
      <artifactId>jta</artifactId> 
      <version>${jta.version}</version> 
     </dependency> 

過濾

FROM DBPasswordEntity pwd WHERE pwd.mdae_dml_art <> 'DELETE' AND pwd.usre_user.usre_username = 'ABC' AND pwd.id = (SELECT MAX(id) FROM DBPasswordEntity pwd2 WHERE pwd2.mdae_rev_ID = pwd.mdae_rev_ID)" 

執行查詢:

this.session.createSQLQuery(sql).executeUpdate(); 

與Hibernat所有配置的完整的例子向在: https://github.com/dominikLudwig/Passwordmanager

+0

雖然你的答案是100%正確的,它也有可能成爲100%無用 如果該鏈接被移動,更改合併到另一個或主站點 剛好消失... **: - (**因此,請[編輯]您的答案,並將 鏈接中的相關步驟複製到您的答案中,從而保證您的答案爲本網站整個生命週期的100%! **; - )**您可以隨時 將您的答案的底部的鏈接作爲您的 材料的來源... –

相關問題