2015-05-13 4 views
1

Я использую ActiveJDBC и Oracle 11g DB. Когда я использую saveIt, я получаю java.sql.Exception. Когда я получаю экземпляр или его список, все в порядке. Что я делаю неправильно?sqlException при использовании ActiveJDBC

Exception in thread "main" org.javalite.activejdbc.DBException: java.sql.SQLException: Invalid argument 
зове, query: INSERT INTO dept (DEPTNO, DNAME, LOC) VALUES (?, ?, ?), params: 45, sdfa, fdg 
     at oracle.jdbc.driver.AutoKeyInfo.getNewSql(AutoKeyInfo.java:187) 
     at oracle.jdbc.driver.PhysicalConnection.prepareStatement(PhysicalConnection.java:5704) 
     at org.javalite.activejdbc.DB.execInsert(DB.java:598) 
     at org.javalite.activejdbc.Model.insert(Model.java:2698) 
     at org.javalite.activejdbc.Model.save(Model.java:2597) 
     at org.javalite.activejdbc.Model.saveIt(Model.java:2524) 
     at JavaHomeTask.Dept.addPersistence(Dept.java:72) 
     at JavaHomeTask.App.addRow(App.java:103) 
     at JavaHomeTask.App.main(App.java:50) 
Caused by: java.sql.SQLException: Invalid argument 
     ... 9 more 

И вот мой код:

public void addPersistence() throws IOException { 
     BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); 
     Dept d = new Dept(); 
     String value; 
     for (String s : getAttributesNames()) { 
      System.out.println("Enter " + s + " and press Enter button:"); 
      value = reader.readLine(); 
      d.set(s, value); 
     } 
     d.saveIt(); 

    } 

public List<String> getAttributesNames() { 
     return Arrays.asList("DEPTNO", "DNAME", "LOC"); 
    } 
+0

Вы можете опубликовать целую трассировку стека? Кроме того, я думаю, что у одного из ваших параметров есть что-то не так с этим, поэтому Oracle жалуется. – ipolevoy

+0

@ipolevoy Кажется, что это целая трассировка стека. Схема таблицы отдела, в котором я попытке вставить строку в DEPTNO Количество (3) DNAME varchar2 (14) LOC varchar2 (13) Я также попытался таким образом: Dept D = новый DEPT(); d.set ("deptno", Integer.valueOf (11)); d.set ("dname", "name"); d.set ("loc", "location"); d.saveIt(); Но результат тот же. PS Извините за мой плохой английский. – alex

+0

Я нашел эту тему https://github.com/javalite/activejdbc/issues/385 Похоже, что у меня такая же проблема, в моей таблице нет столбца id. Я прав? – alex

ответ

2

Причиной probleb является то, что ActiveJDBC использует столбец ID как примари ключ в таблице для распознавания того, какой режим - следует использовать INSERT или UPDATE. И если в таблице нет такого столбца, программист должен указать PK вручную, используя аннотацию @IdName («nameOfColumn»). Более подробную информацию вы найдете here