2016-03-08 76 views
0

我對實體框架相當陌生,不明白爲什麼我的實體不能正確保存。相關實體沒有被保存在事務中

編輯:

我會盡快嘗試了這個測試代碼,看看它是否工作:

@Transactional 
public void doConvert(String lakoKod) { 
    LsZFutelszHavi futelszHavi = new LsZFutelszHavi(); 
    //Give it values like: 
    futelszHavi.setOrigKorrOssz(new BigDecimal(500)); 
    LsTLako lako = lsTLakoRepository.findOneByLakoKod(lakoKod); 
    LsZFutelsz futelsz = lsZFutelszRepository.findOneByLsTLako(lako); 
    //The modification which not get saved into tha Firebird table in the original code. Will it be saved now? 
    futelsz.setSzezVegenBefOssz(new BigDecimal(100)); 
    futelszHavi.setLsZFutelsz(futelsz); 
    lsZFutelszHaviRepository.save(futelszHavi); 
} 

我試圖從舊的DBASE數據庫轉換,到Firebird數據庫。 Firebird數據庫有實體映射的表格。我讀了一個DBASE表,然後逐行轉換它。

我使用@Transactional來保存DBASE表的所有轉換後的實體,或者不保存任何值。

我設法將每個表格正確地轉換成新的數據庫,除了一個。

在其他表中,我只需要爲每個記錄保存一個實體,而不必修改其他類型的實體。我通常必須創建一個Type X實體,將它連接到一個Y型實體,然後保存。爲了節省,我使用存儲庫的實體(如果它很重要的org.springframework.data.repository.PagingAndSortingRepository)

在那個特定的dBASE表,我要創建一個類型的一個實體,它連接到一個類型B實體,修改B型實體,然後保存。問題是,Type B實體修改不會保存到Firebird表中。我再次使用一個存儲庫來保存實體。

要獲得B型實體,我使用它的存儲庫的方法:

LsZFutelsz findOneByLsTLako(LsTLako lsTLako); 

我猜,也許如果我保存這個B型實體與它自己的存儲庫,它會在數據庫中保存正確修改。它沒有幫助。

請告訴我,如果需要額外的信息。

我在這裏複製了我稍微修改過的代碼(刪除了一些日誌記錄,添加了一些註釋)。 LsZFutelszHavi是A類EntityClass,LsZFutelsz是B類EntityClass。

Konverter抽象類。它是爲每個DBASE表繼承的

public abstract class Konverter<RepositoryType extends  CrudRepository<EntityType,Integer>, EntityType> { 
protected String dbfPath; 
protected DBaseTable sourceTable = null; 
protected Logger logger; 
protected RepositoryType repository; 
protected String dBaseEncoding = DBaseTable.CP852; 

public Konverter(String dbfPath, Logger logger, RepositoryType repository) { 
    this.dbfPath = dbfPath; 
    this.logger = logger; 
    this.repository = repository; 
} 

/* 
This method should be called, to start converting 
*/ 
@Transactional 
public void konvert() { 
    try { 
     /*It loads the DBASE database*/  
     File sourceFile = new File(fileName); 
     sourceTable = new DBaseTable(sourceFile, dBaseEncoding); 
     sourceTable.open(IfNonExistent.ERROR); 

     Iterator<Record> recordIterator = sourceTable.recordIterator();    
     int count = 0; 
     try { 
      /*Converts the database table row by row*/ 
      count = konvertSorok(recordIterator); 
     } catch (Exception e) { 
      throw e; 
     } finally { 
      sourceTable.close(); 
     } 
    } 
    catch (CorruptedTableException | IOException | RuntimeException e) { 
     logger.error(QsLoggerUtils.getStackTraceString(e));//e.printStackTrace(); 
    } 

} 

private int konvertSorok(Iterator<Record> recordIterator) { 
    int count = 0; 
    /*Converts the database table row by row*/ 
    while(recordIterator.hasNext()) 
    { 
     Record record = recordIterator.next(); 
     /* Converting one row */ 
     List<EntityType> entityIterable = konvertToEntity(record); 

     for (EntityType entityType : entityIterable) { 
      repository.save(entityType);     
     } 
     count++; 
    }  
    return count; 
} 

/** 
* This should be implemented in the child method 
* @param record 
* @return 
*/ 
protected abstract List<EntityType> konvertToEntity(Record record); 
} 

子類,即implmenets konvertToEntity方法。

public class Konvert14FutelszHavi extends Konverter<LsZFutelszHaviRepository,LsZFutelszHavi> { 

private static Logger logger = LoggerFactory.getLogger(Konvert12Futalany.class); 

LsZFutelszHaviRepository lsZFutelszHaviRepository; 
LsTLakoRepository lsTLakoRepository; 
LsZFutelszRepository lsZFutelszRepository; 
LsTEvhoRepository lsTEvhoRepository; 


@Autowired 
public Konvert14FutelszHavi(LsZFutelszHaviRepository lsZFutelszHaviRepository, 
          LsTLakoRepository lsTLakoRepository, 
          LsZFutelszRepository lsZFutelszRepository, 
          LsTEvhoRepository lsTEvhoRepository) throws IOException { 
    super(DBaseTable.chkFile(AppKonvertLax.PATH_LSZBF, AppKonvertLax.SOURCE_FILE_FUTELSZ_HAVI), logger, lsZFutelszHaviRepository); 
    dBaseEncoding = DBaseTable.CP1250; 
    this.lsTLakoRepository = lsTLakoRepository; 
    this.lsZFutelszHaviRepository = lsZFutelszHaviRepository; 
    this.lsZFutelszRepository = lsZFutelszRepository; 
    this.lsTEvhoRepository = lsTEvhoRepository; 
} 

@Override 
protected List<LsZFutelszHavi> konvertToEntity(Record record) { 
    String ukod  = record.getStringValue("UKOD").substring(1).trim();   
    BigDecimal ekaptam = new BigDecimal(record.getNumberValue("EKAPTAM").toString());   
    BigDecimal efutkul = new BigDecimal(record.getNumberValue("EFUTKUL").toString());    

    ArrayList<LsZFutelszHavi> returnArray = new ArrayList<LsZFutelszHavi>(); 
    LsTLako lsTLako = lsTLakoRepository.findOneByLakoKod(ukod); 
    LsZFutelsz lsZFutelsz = lsZFutelszRepository.findOneByLsTLako(lsTLako); 
    if (lsZFutelsz == null) { 
     return returnArray; 
    } 
    /* Here is the modification in the lsZFutelsz (Type B) entity */ 
    lsZFutelsz.setSzezVegenBefOssz(ekaptam); 

    /* From 10th month to 4th */ 
    for (int i=10; i!=5; i++) { 
     if (i==13) { 
      i = 1; 
     } 
     String keyNumber = Integer.toString(i); 
     if (keyNumber.length() == 1) { 
      keyNumber = "0" + keyNumber; 
     } 
     BigDecimal fk = new BigDecimal(record.getNumberValue("FK_"+keyNumber).toString()); 
     LsZFutelszHavi lsZFutelszHavi = new LsZFutelszHavi(); 
     LsTEvho lsTEvho = lsTEvhoRepository.findOneByEvAndHo(2014, i); 
     lsZFutelszHavi.setLsTEvho(lsTEvho); 
     lsZFutelszHavi.setFizKorrOssz(fk); 
     lsZFutelszHavi.setOrigKorrOssz(efutkul); 
     /* This should be enough to save the lsZFutelsz entity modification I would think */ 
     lsZFutelszHavi.setLsZFutelsz(lsZFutelsz); 
     returnArray.add(lsZFutelszHavi); 
    } 

    /* Even this does not help */ 
    lsZFutelszRepository.save(lsZFutelsz); 

    return returnArray; 
} 

} 

存儲庫類型B實體

@RepositoryRestResource(collectionResourceRel = LsZFutelszHavi.VERB_FUTELSZ, path = LsZFutelszHavi.VERB_FUTELSZ) 
public interface LsZFutelszRepository extends PagingAndSortingRepository<LsZFutelsz, Integer> { 
    /*-----------------------------------------------------------------------------------------------*/ 
    @RestResource(exported=false) 
    @Modifying 
    @Query(value="DELETE FROM ls_z_futelsz f WHERE f.lako_id = ?1", nativeQuery=true) 
    void deleteByLako(Integer integer); 
    /*-----------------------------------------------------------------------------------------------*/ 
    LsZFutelsz findOneByLsTLako(LsTLako lsTLako); 
} 

存儲庫A型實體

@RepositoryRestResource(collectionResourceRel = LsZFutelsz.VERB_FUTELSZHAVI, path = LsZFutelsz.VERB_FUTELSZHAVI) 
public interface LsZFutelszHaviRepository extends PagingAndSortingRepository<LsZFutelszHavi, Integer> { 

} 

實體類型甲

@Entity 
@Table(name="LS_Z_FUTELSZ_HAVI") 
@NamedQuery(name="LsZFutelszHavi.findAll", query="SELECT l FROM LsZFutelszHavi l") 
public class LsZFutelszHavi extends Audit implements Serializable { 

    public static final String VERB_FUTELSZ = "futelszamolasok"; 
    /*-----------------------------------------------------------------------------------------------*/ 
    private static final long serialVersionUID = 1L; 

    @Id 
    @SequenceGenerator(name="GenFutelszHaviID", sequenceName="GEN_LS_Z_FUTELSZ_HAVI_ID", allocationSize= 1) 
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="GenFutelszHaviID") 
    @Column(name="HAVI_ELSZ_ID") 
    private Integer haviElszId; 

    @NotNull 
    @Column(name="FIZ_KORR_OSSZ") 
    private BigDecimal fizKorrOssz; 

    @NotNull 
    @Column(name="ORIG_KORR_OSSZ") 
    private BigDecimal origKorrOssz; 

    //uni-directional many-to-one association to LsFSzlafej 
    @ManyToOne 
    @JoinColumn(name="SZLA_ID") 
    private LsFSzlafej lsFSzlafej; 

    //uni-directional many-to-one association to LsTEvho 
    @ManyToOne 
    @JoinColumns({ 
     @JoinColumn(name="EV", referencedColumnName="EV"), 
     @JoinColumn(name="HO", referencedColumnName="HO") 
     }) 
    private LsTEvho lsTEvho; 

    //bi-directional many-to-one association to LsZFutelsz 
    @ManyToOne 
    @JoinColumn(name="ELSZ_ID") 
    private LsZFutelsz lsZFutelsz; 

    public LsZFutelszHavi() { 
    } 
    //[... setters getters ...] 
} 

實體B型

@Entity 
@Table(name="LS_Z_FUTELSZ") 
@NamedQuery(name="LsZFutelsz.findAll", query="SELECT l FROM LsZFutelsz l") 
public class LsZFutelsz extends Audit implements Serializable { 
    public static final String VERB_FUTELSZHAVI = "futelszhavi"; 
    /*-----------------------------------------------------------------------------------------------*/ 
    private static final long serialVersionUID = 1L; 

    @Id 
    @SequenceGenerator(name="GenFutelszID", sequenceName="GEN_LS_Z_FUTELSZ_ID", allocationSize= 1) 
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="GenFutelszID") 
    @Column(name="ELSZ_ID") 
    private Integer elszId; 

    @NotNull 
    @Column(name="LEOLV_FOGY_GJ") 
    private BigDecimal leolvFogyGj = BigDecimal.ZERO; 

    @NotNull 
    @Column(name="LEOLV_FOGY_OSSZ") 
    private BigDecimal leolvFogyOssz = BigDecimal.ZERO; 

    @NotNull 
    @Column(name="ELOZ_SZEZ_OSSZ") 
    private BigDecimal elozSzezOssz = BigDecimal.ZERO; 

    @NotNull 
    @Column(name="SZEZ_VEGEN_BEF_OSSZ") 
    private BigDecimal szezVegenBefOssz = BigDecimal.ZERO; 

    @NotNull 
    @Column(name="SZOSZT_UTAN_FENNM") 
    private BigDecimal szosztUtanFennm = BigDecimal.ZERO; 

    @NotNull 
    @Column(name="SZOSZTANDO_KULONB") 
    private BigDecimal szosztandoKulonb = BigDecimal.ZERO; 

    //uni-directional many-to-one association to LsTLakok 
    @ManyToOne 
    @JoinColumn(name="LAKO_ID") 
    private LsTLako lsTLako; 

    //bi-directional many-to-one association to LsZFutelszHavi 
    @OneToMany(mappedBy="lsZFutelsz", cascade={CascadeType.REMOVE}) 
    private List<LsZFutelszHavi> lsZFutelszHaviTetelek; 

    public LsZFutelsz() { 
    } 
    //[... setters getters ...] 
} 
+0

你可以請你減少你的代碼到一個最小的例子,顯示問題? – micha

+0

@micha我有一個更緊迫的問題分心。我明天可以創建一個示例代碼 – LaczkoUr

回答

0

代碼有效,該字段總是碰巧是默認值。

用簡單的方法測試後,另一個實體也被保存到數據庫中。然後,我將一個斷點放入原來的代碼中,如果實體的新值與默認值不同,那麼這些代碼只會被破壞。該程序在不中斷斷點的情況下轉換所有內容。

因此,我查找了我轉換的數據庫,並查看內容是什麼。令我驚訝的是它始終是零,默認值。

這很尷尬。我很確定,我誤解了一些東西,並且編錯了。

相關問題